3

Apache Commons を使用して、1.2GB のファイルを 1 行ずつ反復処理しようとしていますFileUtils.lineIteratorLineIteratorただし、 が電話hasNext()をかけるとすぐにjava.lang.OutOfMemoryError: Java heap space. 私はすでに1GJavaヒープに割り当てています。

ここで何が間違っていますか?いくつかのドキュメントを読んだ後、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()
  }

ここであなたの助けをありがとう!

4

1 に答える 1

5

コードはよさそうです。おそらく、ファイル内の行末が見つからず、1Gb を超える非常に長い行をメモリに読み込みます。

Unix で試してwc -l、何行になるか見てみましょう。

于 2014-06-20T19:47:38.777 に答える