Ошибка OutOfMemory при использовании Apache Commons LineIterator

#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 . Мне придется переформатировать данные. Я приму это как можно скорее. Спасибо!