2013-06-26 28 views
0

假设我有一个〜10K元素的数组,我需要处理数组中的所有元素。我想以这种方式处理它们,只有K元素被并行处理。我使用Scala 2.9。我试过平行收集(见下文),但我看到更多K元素并行处理。Scala中的并行处理2.9

 
import collection.parallel.ForkJoinTasks.defaultForkJoinPool._ 
val old = getParallelism 
setParallelism(K) 
val result = myArray.par.map(...) // process the array in parallel 
setParallelism(old) 

你会如何建议过程中Scala 2.9K元素并行处理这样的阵列?

回答

1

setParallelism方法设置并行集合的fork/join池应该使用的并行worker的建议数量。这些K工作人员可以在收集的任何部分工作 - 由调度员决定将工人分配给哪些元素。

如果您想包括在并行操作仅第一K元素,你应该使用take方法,其次是map

myArray.par.take(K).map(...) 

您也可以使用view.take(K).map(...).force做之前创建一个平行视图映射。

+0

谢谢。你能否详细说一下使用'view'? – Michael

+1

观点背后的想法是推迟评估中间集合,否则将使用'take','map'或'filter'在内存中创建集合,直到集合被强制执行为止。由于某些抽象惩罚和间接指导,这可能会或可能不会提高性能,具体取决于转换的内容。你可以在这里阅读更多关于它的内容:http://docs.scala-lang.org/overviews/collections/views.html – axel22