在EPFL的并行编程类(class)中,提到了四个数据并行性抽象:Iterator
,Builder
,Combiner
和Splitter
。
我熟悉Iterator
,但从未使用过其他三个。我在Builder
包下看到了其他特征Combiner
,Splitter
和scala.collection
。但是,我知道如何在实际开发中使用它们,尤其是如何与List
,Array
,ParArray
等其他集合一起使用它们。有人可以给我一些指导和示例吗?
谢谢!
最佳答案
Iterator
和Builder
这两个特征不是并行性特有的,但是它们为Combiner
和Splitter
提供了基础。
Iterator
通过提供hasNext
和next
方法可以帮助您遍历顺序收集。 Splitter
是Iterator
的特例,有助于将集合划分为多个不相交的子集。想法是,分割后,这些子集可以并行处理。您可以通过在并行集合上调用Splitter
来获取.splitter
。 Splitter
特性的两个重要方法如下:remaining: Int
:返回当前集合的元素数量,或者至少是该数量的近似值。此信息非常重要,因为它用于确定拆分集合是否值得。如果您的集合仅包含少量元素,则您要顺序处理这些元素,而不是将集合拆分为更小的子集。 split: Seq[Splitter[A]]
:实际拆分当前集合的方法。它返回不相交的子集(表示为Splitter
),如果值得的话,可以递归地将其再次拆分。如果子集足够小,则最终可以对其进行处理(例如,过滤或映射)。 Builder
在内部用于创建新的(顺序的)集合。 Combiner
是Builder
的特例,同时代表Splitter
的对应物。虽然Splitter
在并行处理集合之前先将其拆分,但Combiner
之后会将结果汇总在一起。您可以通过在并行集合(子集)上调用Combiner
来获取.newCombiner
。这是通过以下方法完成的:combine(that: Combiner[A, B]): Combiner[A, B]
:通过“合并”两个Combiner
将您当前的收藏与另一个收藏相结合。结果是一个新的Combiner
,它表示最终结果,或者再次与另一个子集组合(顺便说一句:类型参数A
和B
表示元素类型和类型或结果集合)。 事实是,如果您不定义新的并行集合,则无需直接实现甚至使用这些方法。这个想法是实现新的并行集合的人们只需要定义拆分器和合并器,并免费获得一大堆其他操作,因为这些操作已经实现并利用了拆分器和合并器。
当然,这只是这些东西如何工作的肤浅描述。为了进一步阅读,我建议阅读Architecture of the Parallel Collections Library和Creating Custom Parallel Collections。
关于scala - Scala中的Builder,Combiner和Splitter是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40098794/