そう。私は Scala を使用していますが、比較的慣れていません (ほとんどが Python のやつです)。sbt 経由でコードをコンパイルして実行しています。現在 Java 6 を実行している Ubuntu ボックスを使用しています。2 つの CSV があります。それらを取得し、処理し、操作する必要があります。各 CSV は最大 250 MB です。これが機能する場合は、はるかに大きな CSV でこのプロセスを繰り返す可能性があります。
CSV を読み取り、必要なデータ構造に各行を書き込む関数を定義しました。各 CSV でこの関数を順番に呼び出します。問題は、最初の CSV では完全に (そして非常に迅速に) 返されるが、2 番目の 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)}
}
ありがとう!