並行して処理しようとしている xml ファイルがたくさんあります。future を使用する私の scala コード (2.9.2) は、最初はうまくいきますが、マシンにある 32G のほぼ 100% を消費してしまいます。これをシーケンシャルに行うと発生しないので、scala フューチャーを使用する際のガベージ コレクションに何か問題があると思います。
これが私のコードの簡素化されたバージョンです。誰が何が悪いのか教えてもらえますか?
val filenameGroups = someStringListOfFilepaths.grouped(1000).toStream
val tasks = filenameGroups.map {
fg =>
scala.actors.Futures.future {
val parser = new nu.xom.Builder() // I'm using nu.xom. Not sure it matters.
fg.map {
path => {
val doc = parser.build(new java.io.File(path))
val result = doc.query(some xpath query)
result
}
}.toList
}
}
val pairs = tasks.par.flatMap(_.apply)
ETA: わかりました、これは解決しましたが、なぜこれが違いを生むのかまだわかりません.
内側のループのほとんどのコードを抽象化し、再実行しました。そして、未来からパーサーのインスタンス化を引き出しました。メモリ使用量は、まともな 17% で横ばいになりました。なぜこれが違いを生むのか、誰にも分かりますか?
これが私がやったことの単純化されたバージョンです:
def process(arglist...) = yada
val tasks = filenameGroups.map {
fg =>
val parser = new nu.xom.Builder()
scala.actors.Futures.future {
process(fg, parser)
}
}
val pairs = tasks.par.flatMap(_.apply)