我尝试使用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()
}
感谢您的帮助!
答案 0 :(得分:5)
代码看起来不错。可能它没有在文件中找到一行的结尾,并且在内存中读取一条大于1Gb的非常长的行。
在Unix中尝试wc -l
,看看你获得了多少行。