#java #scala #out-of-memory #apache-commons #fileutils
#java #scala #нехватка памяти #apache-commons #fileutils
Вопрос:
Я пытаюсь выполнить построчную итерацию файла объемом 1,2 ГБ с использованием Apache Commons FileUtils.lineIterator
. Однако, как только a LineIterator
вызывает hasNext()
, я получаю java.lang.OutOfMemoryError: Java heap space
. Я уже выделил 1G
в кучу java.
Что я здесь делаю не так? После прочтения некоторых документов, разве LineIterator не должен считывать файл из файловой системы, а не загружать его в память?
Обратите внимание, что код написан на Scala:
val file = new java.io.File("data_export.dat")
val it = org.apache.commons.io.FileUtils.lineIterator(file, "UTF-8")
var successCount = 0L
var totalCount = 0L
try {
while ( {
it.hasNext()
}) {
try {
val legacy = parse[LegacyEvent](it.nextLine())
BehaviorEvent(legacy)
successCount = 1L
} catch {
case e: Exception => println("Parse error")
}
totalCount = 1
}
} finally {
it.close()
}
Спасибо за вашу помощь здесь!
Комментарии:
1. вау, на данный момент у нас точно такое же количество точек 🙂 — 3642
2. @AlekseyIzmailov ха-ха, интересно, какое статистическое совпадение этого? позвольте мне загрузить построчно набор данных StackOverflow и вернуться к вам: P
Ответ №1:
Код выглядит хорошо. Вероятно, он не находит конец строки в файле и считывает в память очень длинную строку размером более 1 ГБ.
Попробуйте wc -l
в Unix и посмотрите, сколько строк вы получите.
Комментарии:
1. Вот дерьмо, ты прав! Я не понимал, что это была одна массивная строка. Вот результат от
wc -l
:0 data_export.dat
. Мне придется переформатировать данные. Я приму это как можно скорее. Спасибо!