运行`... par.map(直接在大型列表上?)是一个好主意吗?

Vil*_*tas 12 scala parallel-collections

假设我有一个有点大(几百万个项目,或者说)字符串列表.运行这样的东西是个好主意:

val updatedList = myList.par.map(someAction).toList
Run Code Online (Sandbox Code Playgroud)

或者在运行之前将列表分组是一个更好的主意...par.map(,如下所示:

val numberOfCores = Runtime.getRuntime.availableProcessors
val updatedList = 
  myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten
Run Code Online (Sandbox Code Playgroud)

更新:由于someAction是相当昂贵的(比较grouped,toList等等)

Dan*_*ral 14

par.map直接运行,因为它已经考虑了核心数量.但是,请不要保留List,因为这需要完整副本才能生成并行集合.相反,使用Vector.


axe*_*l22 8

正如所建议的那样,避免使用列表par,因为这需要将列表复制到可以轻松并行遍历的集合中.有关说明,请参阅并行集合概述.

关于具体并行集合类部分所述,ParVector对于map操作而言,a 可能不如a ParArray,因此如果您真的关心性能,则使用并行数组可能是有意义的.

但是,如果someAction是昂贵的不够,那么它的计算成本将隐藏在连续的瓶颈toListpar.