2011-10-05 21 views
11

Parece que cuando invoco map en una lista paralela, la operación se ejecuta en paralelo, pero cuando hago filter en esa lista, la operación se ejecuta estrictamente de forma secuencial. Entonces, para hacer que filter sea paralelo, primero asigno un mapa a (A, Boolean), luego filmo esas tuplas y vuelvo a mapear todo. No parece muy conveniente.¿Qué operaciones en las colecciones paralelas de Scala están paralelizadas?

Por lo tanto, estoy interesado: ¿qué operaciones en colecciones paralelas están paralelizadas y cuáles no?

+1

[A Generic Parallel Collection Framework] (http://infoscience.epfl.ch/record/150220/files/pc.pdf) – agilesteel

Respuesta

11

No hay listas paralelas. Llamar al par en un List convierte el List en la secuencia predeterminada inmutable en paralelo: un ParVector. Esta conversión procede de forma secuencial. Tanto el filter como el map deberían ser paralelos.

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) 

Tal vez haya concluido que la filter no es paralelo, debido a que usted ha medido tanto el tiempo de conversión y el tiempo filter.

Algunas operaciones no están paralelizadas actualmente: sort* variantes, indexOfSlice.

Cuestiones relacionadas