所以。我正在使用Scala,而且我對它相對比較陌生(主要是一個python傢伙)。我正在編譯並通過sbt運行我的代碼。我在一個Ubuntu機器上,目前運行Java 6。我有兩個CSV;我需要把他們,處理他們,然後操縱他們。每個CSV是〜250MB;如果這有效,我可能會用更大的CSV重複此過程。斯卡拉超大CSV CSV讀取的GC開銷限制
我已經定義了一個讀取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)}
}
謝謝!
使用循環does not看起來Scala'ish。 1.使用filelines.foldLeft將csv數據轉換爲地圖。 2.儘量使addRowtoRet遞歸 – Rajesh
如果你仍然想要去相同的代碼嘗試使用ret.par.map {TUP =>(tup._1 - > tup._2.sorted)} – Rajesh
你在SBT運行時分叉? javaOptions僅用於如果sbt派生一個新進程來運行你的程序,這不是默認行爲。 –