我有一堆xml文件,我试图并行处理。我的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)
要同时处理多少个文件?看起来你至少有成千上万。将数千个XML文件加载到内存中将很快耗尽您的整个RAM。按顺序执行此操作基本上读取文件,进行处理,并有资格进行垃圾回收。 –
@TomaszNurkiewicz我想处理尽可能多的,我有200K文件。我只是假设scala期货会很聪明,并且只能创建8个(或者你有多个处理器)未来的实例,所以我一次只能在内存中创建8个xml文档。 – JasonMond