سؤال

وحصلت مشكلة مماثلة ل هذا الرجل أثناء معالجة <القوي> 4MB ملف السجل. في الواقع أنا معالجة ملفات متعددة في وقت واحد ولكن منذ وأظل الحصول على هذا الاستثناء، وأنا قررت أن مجرد اختبار لملف واحد:

val temp = Source.fromFile("./datasource/input.txt")
val dummy = new PrintWriter("test.txt")
var itr = 0
println("Default Buffer size: " + Source.DefaultBufSize)
try {
    for( chr <- temp) {
        dummy.print(chr.toChar)
        itr += 1
        if(itr == 75703) println("Passed line 85")
        if(itr % 256 == 0){ print("..." + itr); temp.reset; System.gc; }
        if(itr == 75703) println("Passed line 87")
        if(itr % 2048 == 0) println("")
        if(itr == 75703) println("Passed line 89")
    }
} finally {
    println("\nFalied at itr = " + itr)
}

وماذا أنا دائما تحصل عليه هو أنه سوف يفشل في بالميدان = 75703، في حين أن ملف الإخراج الخاص بي وسوف يكون دائما 64KB (65536 بايت بالضبط). لا يهم أين أضع temp.reset أو System.gc، جميع التجارب ينتهي نفسها.

ويبدو أن تعتمد هذه المشكلة على بعض تخصيص الذاكرة ولكن لا أستطيع أن أجد أي معلومات مفيدة عن هذه المشكلة. أي فكرة عن كيفية حل هذه واحدة؟

وكل ما تبذلونه من يساعد تحظى بتقدير كبير

وتحرير: في الواقع أريد أن معالجة أنها الملفات الثنائية، لذلك هذه التقنية ليست حلا جيدا، وكان كثير يوصي لي لاستخدام BufferedInputStream بدلا

هل كانت مفيدة؟

المحلول

لماذا أنت تدعو على reset في Source قبل انتهائه بالتكرار من خلال الملف؟

val temp = Source.fromFile("./datasource/input.txt")
try {
  for (line <- tem p.getLines) {
    //whatever
  }
finally temp.reset     

ويجب أن تعمل على ما يرام مع أي underflows. انظر أيضا هذا السؤال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top