Вопрос

У меня похожая проблема с этой парень во время обработки 4 МБ файла журнала. На самом деле я обрабатываю несколько файлов одновременно, но так как я получаю это исключение, я решил проверить его на наличие одного файла:

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)
}

Я всегда получаю то, что произойдет сбой при 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     

Должно работать нормально, без потерь. См. Также этот вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top