Какие операции над параллельными коллекциями Scala распараллелены? - PullRequest
11 голосов
/ 05 октября 2011

Кажется, что когда я вызываю map в параллельном списке, операция выполняется параллельно, но когда я делаю filter в этом списке, операция выполняется строго последовательно. Таким образом, чтобы сделать filter параллельным, я сначала сопоставляю с (A, Boolean), затем фильтрую эти кортежи и снова отображаю все обратно. Это не очень удобно.

Так что мне интересно - какие операции над параллельными коллекциями распараллеливаются, а какие нет?

1 Ответ

11 голосов
/ 05 октября 2011

Нет параллельных списков. Вызов par для List преобразует List в параллельную неизменную последовательность по умолчанию - a ParVector. Это преобразование происходит последовательно. И filter, и map должны быть параллельными.

scala> import scala.collection._
import scala.collection._

scala> List(1, 2, 3).par.filter { x => println(Thread.currentThread); x > 0 }
Thread[ForkJoinPool-1-worker-5,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-0,5,main]
res0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3)

Возможно, вы пришли к выводу, что filter не параллелен, потому что вы измерили время преобразования и filter время.

Некоторые операции не распараллелены в настоящее время: sort* варианты, indexOfSlice.

...