2011-10-05 72 views
11

好像当我在并行列表上调用map时,该操作并行运行,但是当我在该列表上执行filter时,操作严格按顺序运行。因此,为了使filter平行,我首先映射到(A,布尔),然后过滤这些元组,然后再映射回来。感觉不是很方便。Scala并行集合上的哪些操作是并行化的?

所以我很感兴趣 - 并行集合上的哪些操作是并行的,哪些不是?

+1

[通用并行集合框架](http://infoscience.epfl.ch/record/150220/files/pc.pdf) – agilesteel

回答

11

没有平行列表。在List上调用par可将List转换为默认的并行不可变序列 - ParVector。该转换顺序进行。然后filtermap应该是平行的。

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