所以。我正在使用 Scala,而且我对它比较陌生(主要是 python 人)。我正在通过 sbt 编译和运行我的代码。我在一个 Ubuntu 机器上,目前正在运行 Java 6。我有两个 CSV;我需要接受它们,处理它们,然后操纵它们。每个 CSV 约为 250mb;如果这可行,我可能会用更大的 CSV 重复这个过程。
我已经定义了一个读取 CSV 并将每一行写入我需要的数据结构的函数。我在每个 CSV 上串联调用此函数。问题是:它为第一个 CSV 完美返回(并且非常快),但第二个总是抛出java.lang.OutOfMemoryError: GC overhead limit exceeded
错误。
我已经尝试了很多东西。我的build.sbt
定义javaOptions += "-Xmx20480m -XX:+HeapDumpOnOutOfMemoryError"
;我也尝试过使用-XX:-UseGCOverheadLimit
,但这似乎没有任何帮助。根据我一直在阅读的 Java 文档,该错误表明大量系统资源正在用于垃圾收集 - 但坦率地说,我不清楚它是什么垃圾收集,或者如何减少它。我假设我的函数一定是......在某处泄漏内存,或者我一定是误用了 Scala,但我不知道怎么做。
这是我的功能:
def readAndProcessData(path: String) = {
val fileLines = Source.fromFile(path).getLines.drop(1)
val ret = mutable.Map[String, List[Tuple2[String, String]]]()
def addRowToRet(row: String) = {
val rowArray = row.split(",")
if (!(ret contains rowArray(0))) {
ret.update(rowArray(0), List[Tuple2[String, String]]())
}
ret(rowArray(0)) = Tuple2(rowArray(1), rowArray(2)) :: ret(rowArray(0))
}
for (row <- fileLines) {
addRowToRet(row)
}
ret.map{tup => (tup._1 -> tup._2.sorted)}
}
谢谢!