2011-10-05 10 views
11

Wygląda na to, że podczas wywoływania map na liście równoległej operacja przebiega równolegle, ale kiedy wykonuję filter na tej liście, operacja przebiega ściśle sekwencyjnie. Aby wykonać parowanie filter, najpierw mapuję do (A, Boolean), następnie filtruję te krotki i mapuję wszystko z powrotem. To nie jest bardzo wygodne.Które operacje w równoległych kolekcjach Scala są zrównoleglone?

Więc jestem zainteresowany - które operacje w równoległych kolekcjach są zrównoleglone, a które nie?

+1

[Ogólny równoległy system gromadzenia danych] (http://infoscience.epfl.ch/record/150220/files/pc.pdf) – agilesteel

Odpowiedz

11

Brak równoległych list. Wywołanie par na List przekształca List w domyślną niezmienną sekwencję równoległą - ParVector. Ta konwersja przebiega sekwencyjnie. Zarówno filter, jak i map powinny być równoległe.

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) 

Być może już stwierdzić, że filter nie jest równoległa, dlatego, że mierzy się zarówno czas konwersji i czas filter.

Niektóre operacje obecnie nie są zrównoleglone: ​​sort* wariantów, indexOfSlice.

Powiązane problemy