3

我正在尝试使用 Apache Commons 逐行迭代 1.2GB 文件FileUtils.lineIterator。但是,只要一个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()
  }

感谢您在这里的帮助!

4

1 回答 1

5

代码看起来不错。可能它没有在文件中找到行尾,而是将大于 1Gb 的很长的行读入内存。

在 Unix 中尝试wc -l,看看你得到了多少行。

于 2014-06-20T19:47:38.777 回答