在Scala中使用并行集合的首选方法是什么?

soc*_*soc 5 parallel-processing scala language-design scala-collections

起初我假设每个集合类都会收到一个额外的par方法,它将集合转换为适合的并行数据结构(比如map返回Scala 2.8中元素类型的最佳集合).

目前看来,一些集合类支持par方法(如数组),但其他人toParSeq,toParIterable方法(如表).这有点奇怪,因为经常不使用或推荐Array.

这是什么原因?par在所有收集课上做"正确的事" 是不是更好?

如果我有可能并行处理的数据,我应该使用哪些类型?scala.collection直接实现的特征或类型?

或者我Arrays现在应该更喜欢,因为它们似乎更便宜并行化?

Rex*_*err 5

列表不太适合并行处理.原因是要到达列表的末尾,您必须遍历每个元素.因此,您也可以将列表视为迭代器,因此也可以使用更通用的内容toParIterable.

任何具有快速索引的集合都是并行处理的良好候选者.这包括任何实现LinearSeqOptimized,加上树和哈希表. Array具有尽可能快的索引,所以这是一个相当自然的选择.你也可以使用像ArrayBuffer(有一个par方法返回a ParArray)的东西.