scala - scala 中的 Builder、Combiner 和 Splitter 是什么?

标签 scala collections parallel-processing

在 EPFL 的并行编程类(class)中,提到了数据并行的四个抽象:IteratorBuilderCombiner分离器

我熟悉Iterator,但从未使用过其他三个。我在 scala.collection 包下看到了其他特征 BuilderCombinerSplitter。但是,我知道如何在实际开发中使用它们,特别是如何与其他集合(例如 ListArrayParArray 协作使用它们) code> 等。有人可以给我一些指导和示例吗?

谢谢!

最佳答案

两个特征IteratorBuilder并不特定于并行性,但是,它们为 Combiner 提供了基础和Splitter

  • 您已经知道 Iterator可以通过提供方法 hasNext 来帮助您迭代顺序集合。和next 。一个SplitterIterator 的一个特例并有助于将集合划分为多个不相交的子集。这个想法是,在 split 之后,这些子集可以并行处理。您可以获得Splitter通过调用 .splitter 从并行集合中在上面。 Splitter的两个重要方法特点如下:
    • remaining: Int :返回当前集合的元素数量,或至少返回该数量的近似值。此信息很重要,因为它用于决定是否值得拆分集合。如果您的集合仅包含少量元素,那么您希望按顺序处理这些元素,而不是将集合拆分为更小的子集。
    • split: Seq[Splitter[A]] :实际分割当前集合的方法。它返回不相交的子集(表示为 Splitter s),如果值得的话,可以递归地再次分割这些子集。如果子集足够小,它们最终可以被处理(例如过滤或映射)。
  • Builder s 在内部用于创建新的(连续的)集合。一个CombinerBuilder 的一个特例同时代表 Splitter 的对应项。而Splitter在并行处理之前分割您的集合,a Combiner之后将结果放在一起。您可以获得Combiner通过调用 .newCombiner 从并行集合(子集)中在上面。这是通过以下方法完成的:
    • combine(that: Combiner[A, B]): Combiner[A, B] :通过“合并”两个集合将您当前的集合与另一个集合结合起来 Combiner s。结果是一个新的 Combiner ,它要么代表最终结果,要么再次与另一个子集组合(顺便说一下:类型参数 AB 代表元素类型和类型或结果集合)。

问题是,如果您不定义新的并行集合,则不需要直接实现甚至使用这些方法。这个想法是,实现新并行集合的人们只需要定义拆分器和组合器,并免费获得一大堆其他操作,因为这些操作已经实现并使用了拆分器和组合器。

当然,这只是这些东西如何工作的表面描述。如需进一步阅读,我建议阅读 Architecture of the Parallel Collections Library以及Creating Custom Parallel Collections .

关于scala - scala 中的 Builder、Combiner 和 Splitter 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40098794/

相关文章:

java - 在多个服务器上分配 Java 线程?

design-patterns - 双折功能图案

java - Java 中的对象是否有任何内存大小限制?

java - 将 Collection<Foo> 映射到 MultiMap<A, B> 的惯用方法是什么?

c# - 找不到属性设置方法

c# - Parallel ForEach 或 For 循环中的返回值和关键字

c - MPI 数组未声明

scala - scala 与 JVM 的联系有多紧密?

scala - Pureconfig 将配置读取为属性映射

scala - Scala 和 Clojure 中的简单字符串模板替换