【问题标题】:Parallel map operations?并行地图操作?
【发布时间】:2013-11-20 10:07:03
【问题描述】:

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)

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

【问题讨论】:

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

标签: scala concurrency parallel-collections


【解决方案1】:

如果您添加par,那么您将获得一个并行集合,并且对它的操作将被并行处理。要转换回普通集合,请调用 toList

所以你的代码看起来像:

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

.seq 获取顺序集合(并行集合的相反)。

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

Also, check the documentation.

【讨论】:

    【解决方案2】:

    par 将您的列表拆分为多个线程进行处理。然后,您可以通过修改结果ParSeqtasksupport 成员来调节线程是如何完成的。

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多