1

次のようなコードが少しあります。

val data = List(obj1, obj2, obj3, obj4, ...).par.map { ... }

ParVector は約 12 要素の大きさです。すべての作業がメイン スレッドで行われていることに気付いたので、スタック トレースをトレースすると、次の行 (以下のリンク) で、ifParallel が false (CanBuildFrom から) であることがわかりました。それが間違っている理由と、それを助けるために私にできることについてのヒントはありますか?

https://github.com/paulp/scala-full/blob/2.9.0.1/src/library/scala/collection/parallel/ParIterableLike.scala#L504

4

2 に答える 2

0

使用していたscalaのバージョンに誤りがありました。その後、修正されました。

于 2012-09-16T01:32:14.597 に答える
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: 並列コレクションが機能しない?を参照してください。同様の症状があり、人為的な遅延を追加すると、物事が並行して発生する可能性があることが示されました。

ifParallelそれ以外のルートを取っていることをどのように確認しますか? 私はこれをします:

scala> collection.parallel.ParSeq.canBuildFrom[Int].isParallel
res0: Boolean = true

また、 の値はRuntime.getRuntime.availableProcessors?

于 2011-09-27T02:08:16.677 に答える