【问题标题】:OutOfMemory error when using Apache Commons lineIterator使用 Apache Commons lineIterator 时出现 OutOfMemory 错误
【发布时间】:2014-06-20 19:44:11
【问题描述】:

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

在这里感谢您的帮助!

【问题讨论】:

  • 哇,此刻我们的分数完全相同:) - 3642
  • @AlekseyIzmailov 哈哈,我想知道统计上的一致性是什么?让我逐行加载 StackOverflow 数据集并返回给您:P

标签: java scala out-of-memory apache-commons fileutils


【解决方案1】:

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

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

【讨论】:

  • 哦,废话,你是对的!我没有意识到这是一条单一的、庞大的线路。这是wc -l 的结果:0 data_export.dat。我将不得不重新格式化数据。我会尽快接受。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2016-08-28
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多