scala中的Builder,Combiner和Splitter是什么?

时间:2016-10-18 02:57:19

标签: scala collections parallel-processing

在EPFL的并行编程课程中,提到了四个数据并行的抽象:IteratorBuilderCombinerSplitter

我熟悉Iterator,但从未使用其他三个。我在Builder包下看到了其他特征CombinerSplitterscala.collection。但是,我知道如何在实际开发中使用它们,特别是如何与其他集合(如ListArrayParArray等合作使用它们。有谁可以请给我一些指导和例子?

谢谢!

1 个答案:

答案 0 :(得分:9)

两个特征IteratorBuilder并非特定于并行性,但它们为CombinerSplitter提供了基础。

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

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

当然,这只是对这些事情如何运作的肤浅描述。如需进一步阅读,建议您阅读Architecture of the Parallel Collections Library以及Creating Custom Parallel Collections