12

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

val updatedList = myList.par.map(someAction).toList

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

val numberOfCores = Runtime.getRuntime.availableProcessors
val updatedList = 
  myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten

更新:鉴于这someAction非常昂贵(与grouped,toList等相比)

4

2 回答 2

14

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

于 2012-04-07T14:05:51.777 回答
8

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

具体并行集合类部分所述, aParVector的操作效率可能map低于 a ParArray,因此如果您真的关心性能,使用并行数组可能是有意义的。

但是,如果someAction足够昂贵,那么它的计算成本将隐藏 和 中的顺序toList瓶颈par

于 2012-04-07T18:13:10.503 回答