通过并行收集,聚合方面的顺序?

时间:2011-06-10 08:32:39

标签: scala parallel-collections

在scala中,我有一个并行的Iterable项目,我想迭代它们并以某种方式聚合结果,但是按顺序。我将简化我的用例,并说我们从一个整数的Iterable开始,并希望以并行方式连接它们的字符串表示,结果按顺序。

这可能是折叠还是聚合?从文档中不清楚哪些方法可以并行化但保持顺序。

3 个答案:

答案 0 :(得分:4)

是的,对于并行集合上的fold / aggregate / reduce操作,可以保留订单。这没有很好的记录。诀窍是你要折叠的操作必须是关联的(因此能够被任意分割和重新组合),但不需要是可交换的(因此不能安全地重新排序)。字符串连接是关联,非交换操作的完美示例,因此折叠可以并行完成。

val concat = myParallelList.map(_.toString).reduce(_+_)

答案 1 :(得分:1)

对于折叠:foldRightfoldLeft无法并行处理,您需要使用新的fold方法(更多信息there)。

fold类似,aggregate可以并行执行:它“按顺序遍历不同分区中的元素”(Scaladoc),尽管看起来你对分区的方式没有直接影响选择的。

答案 2 :(得分:0)

我认为,根据Odersky的出版物(http://infoscience.epfl.ch/),对Jean-Philippe Pellets的评论意义上保留'顺序'的答案是有保证的。记录/ 150220 / files / pc.pdf)IFF分割您的集合的部分在订单方面表现良好。

即。如果你有元素a< b< c和a和c在一个分区中结束,因此b也在同一个分区中。

我不记得究竟是什么部分负责拆分,但是如果你找到它,你可能会在其文档或源代码中提供足够的信息来回答你的问题。