2

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

折叠或聚合有可能吗?从文档中不清楚哪些方法可以并行工作但保持顺序。

4

3 回答 3

4

是的,保证为并行集合上的折叠/聚合/减少操作保留顺序。这没有很好的记录。诀窍是您要折叠的操作必须是关联的(因此能够被任意拆分和重新组合),但不必是可交换的(因此不能安全地重新排序)。字符串连接是关联、非交换操作的完美示例,因此折叠可以并行完成。

val concat = myParallelList.map(_.toString).reduce(_+_)
于 2011-06-10T11:54:01.977 回答
1

对于 folds:foldRight并且foldLeft不能并行处理,您需要使用新方法(那里有fold更多信息)。

Like fold,aggregate可以并行工作:它“按顺序遍历不同分区中的元素”(Scaladoc),尽管看起来您对如何选择分区没有直接影响。

于 2011-06-10T08:41:19.290 回答
0

我认为,由于根据 Odersky 的出版物(http://infoscience.epfl.ch/record/150220)实施并行集合的方式,保证了对 Jean-Philippe Pellets 答案的评论意义上的“秩序”的保留/files/pc.pdf) IFF 拆分您的收藏的部分在订单方面表现良好。

即,如果您有元素 a < b < c 并且 a 和 c 最终位于一个分区中,则 b 也位于同一分区中。

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

于 2011-06-10T11:40:34.270 回答