Карта ParVector не работает параллельно - PullRequest
1 голос
/ 27 сентября 2011

У меня есть немного кода вроде:

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

Ответы [ 2 ]

0 голосов
/ 16 сентября 2012

Произошла ошибка в версии scala, которую я использовал.С тех пор это было исправлено.

0 голосов
/ 27 сентября 2011

Я не могу воспроизвести это:

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?

...