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

时间:2012-04-07 13:51:06

标签: scala parallel-collections

假设我有一些相当大的(数百万项左右)字符串列表。运行这样的东西是个好主意:

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相当昂贵(与groupedtoList等相比)。

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

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

正如section on concrete parallel collection classes中所述,ParVector操作map可能效率低于ParArray,所以如果您真的关心性能,那么使用并行数组可能有意义。

但是,如果someAction足够昂贵,那么其计算成本将隐藏toListpar中的顺序瓶颈。