2013-11-20 42 views
14

是否斯卡拉提供一种方式来执行并行映射操作为标准语言的一部分?并行地图操作?

例如,给定:

scala> val a = List((1,2), (3,4), (3,6)) 
a: List[(Int, Int)] = List((1,2), (3,4), (3,6)) 

我可以这样做:

scala> a.map(tup => tup._1 + tup._2) 
res0: List[Int] = List(3, 7, 9) 

但是,据我所知,这在映射列表中提供的功能顺序对象。是否有一种内置的方法可以将该函数应用于单独线程(或同等方法)中的每个元素,然后将结果收集到结果列表中?

+2

不要使用'List'分布式('par')操作。你应该使用'IndexedSeq'。 – senia

+0

@senia - 你能不能简单地阐述为什么在这种情况下使用列表是一个坏主意?我不需要以任何方式订购产生的清单。 – csvan

+5

这是因为'par'方法创建'parallel collection'的方式。对于'Vector'(默认'IndexedSeq'实现),'Range'和'Array',它只是用轻量级包装器包装初始集合。但对于List来说,它应该创建一个全新的集合,这可能会导致性能问题。参见[创建并行采集(http://docs.scala-lang.org/overviews/parallel-collections/overview.html#creating_a_parallel_collection)。 – senia

回答

25

如果添加par那么你会得到一个并行的收集和操作也将在并行处理。要转回到正常收集电话toList

所以,你的代码看起来像:

a.par.map(tup => tup._1 + tup._2).toList 

Also, check the documentation.

7

par分割在多个线程的处理名单。然后,您可以调节如何线程被modyfying产生的ParSeqtasksupport成员来完成。