我有一堆我试图并行处理的 xml 文件。我使用 future 的 scala 代码(2.9.2)开始时很好,但最终吃掉了我机器上近 100% 的 32G。当我按顺序执行此操作时不会发生这种情况,所以我的猜测是在使用 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)