2011-10-05 13 views
11

Sembra che quando invoco map in un elenco parallelo, l'operazione venga eseguita in parallelo, ma quando eseguo l'operazione filter in tale elenco, l'operazione viene eseguita in modo strettamente sequenziale. Quindi, per rendere parallelo filter, per prima cosa mappare su (A, Booleano), quindi filtrare quelle tuple e mappare nuovamente tutto. Non è molto conveniente.Quali operazioni sulle collezioni parallele Scala sono parallelizzate?

Quindi sono interessato - quali operazioni su raccolte parallele sono parallele e quali no?

+1

[Un quadro di raccolta parallela generica] (http://infoscience.epfl.ch/record/150220/files/pc.pdf) – agilesteel

risposta

11

Non ci sono elenchi paralleli. La chiamata a par su un List converte lo List nella sequenza immutabile parallela predefinita: a ParVector. Questa conversione procede in sequenza. Entrambi i modelli filter e map devono essere paralleli.

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) 

Forse avete già concluso che il filter non è parallela, perché hai misurato sia il tempo di conversione e il tempo filter.

Alcune operazioni non parallelizzate attualmente: varianti sort*, indexOfSlice.

Problemi correlati