在EPFL的并行编程类(class)中,提到了四个数据并行性抽象:IteratorBuilderCombinerSplitter

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

谢谢!

最佳答案

IteratorBuilder这两个特征不是并行性特有的,但是它们为CombinerSplitter提供了基础。

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

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

    当然,这只是这些东西如何工作的肤浅描述。为了进一步阅读,我建议阅读Architecture of the Parallel Collections LibraryCreating Custom Parallel Collections

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

    10-11 17:51