我有一些代码:
val data = List(obj1, obj2, obj3, obj4, ...).par.map { ... }
并且ParVector大约有12个元素。我注意到我的所有工作都是在主线程中完成的,所以我追溯到堆栈跟踪,发现在下一行(在下面的链接中),ifParallel为false(来自CanBuildFrom)。关于为什么它是假的,以及我能做些什么来帮助它的任何暗示?
答案 0 :(得分:0)
我无法重现这个:
case class Obj(i: Int)
val list = List(1 to 12 map Obj: _*)
def f(o: Obj) = { println("f " + o); Obj(o.i + 1) }
val data = list.par.map(f)
打印:
f Obj(1)
f Obj(2)
f Obj(3)
f Obj(4)
f Obj(5)
f Obj(6)
f Obj(7)
f Obj(8)
f Obj(10)
f Obj(11)
f Obj(12)
f Obj(9)
// data: ParVector(Obj(2), Obj(3), Obj(4), Obj(5), Obj(6), Obj(7), Obj(8), Obj(9),
// Obj(10), Obj(11), Obj(12), Obj(13))
请参阅scala: parallel collections not working?了解类似的症状,并且添加一些人为延迟表明事情可能并行发生。
你如何发现ifParallel
正在采取其他方式?我这样做:
scala> collection.parallel.ParSeq.canBuildFrom[Int].isParallel
res0: Boolean = true
此外,Runtime.getRuntime.availableProcessors
的价值是什么?
答案 1 :(得分:0)
我正在使用的scala版本出错。它已被修复。