Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 并行地图操作?_Scala_Concurrency_Parallel Collections - Fatal编程技术网

Scala 并行地图操作?

Scala 并行地图操作?,scala,concurrency,parallel-collections,Scala,Concurrency,Parallel Collections,Scala是否作为标准语言的一部分提供了执行并行映射操作的方法 例如,假设: 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) 然而,据我所知,这将提供的函数按顺序映射到列表对象上。是否有一种内置方

Scala是否作为标准语言的一部分提供了执行并行映射操作的方法

例如,假设:

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)

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

par
将列表拆分为多个线程进行处理。然后,您可以通过修改结果
ParSeq
的成员来调节线程的执行方式

如果您添加
par
,那么您将获得一个并行集合,并对其进行并行处理。要转换回正常采集,请调用
toList

因此,您的代码如下所示:

a.par.map(tup => tup._1 + tup._2).toList
.seq
以获得顺序收集(与并行收集相反)


对于分布式(
par
)操作,不要使用
List
。您应该使用
IndexedSeq
@senia-您能简单地解释一下为什么在这种情况下使用列表是个坏主意吗?我不需要对结果列表进行任何排序。这是因为
par
方法创建
parallel collection
的方式。对于
Vector
(默认
IndexedSeq
实现),
Range
Array
它只使用轻量级包装器包装初始集合。但是对于
列表
它应该创建一个全新的集合,这可能会导致性能问题。看。为了语言的精确性,“并行”和“分布式”真的不应该混为一谈。对,解决这个问题。另外,非常感谢@senia的澄清
a.par.map(tup => tup._1 + tup._2).seq