在 EPFL 的并行编程类(class)中,提到了数据并行的四个抽象:Iterator
、Builder
、Combiner
和 分离器
。
我熟悉Iterator
,但从未使用过其他三个。我在 scala.collection
包下看到了其他特征 Builder
、Combiner
和 Splitter
。但是,我知道如何在实际开发中使用它们,特别是如何与其他集合(例如 List
、Array
、ParArray
协作使用它们) code> 等。有人可以给我一些指导和示例吗?
谢谢!
最佳答案
两个特征Iterator
和Builder
并不特定于并行性,但是,它们为 Combiner
提供了基础和Splitter
。
- 您已经知道
Iterator
可以通过提供方法hasNext
来帮助您迭代顺序集合。和next
。一个Splitter
是Iterator
的一个特例并有助于将集合划分为多个不相交的子集。这个想法是,在 split 之后,这些子集可以并行处理。您可以获得Splitter
通过调用.splitter
从并行集合中在上面。Splitter
的两个重要方法特点如下:-
remaining: Int
:返回当前集合的元素数量,或至少返回该数量的近似值。此信息很重要,因为它用于决定是否值得拆分集合。如果您的集合仅包含少量元素,那么您希望按顺序处理这些元素,而不是将集合拆分为更小的子集。 -
split: Seq[Splitter[A]]
:实际分割当前集合的方法。它返回不相交的子集(表示为Splitter
s),如果值得的话,可以递归地再次分割这些子集。如果子集足够小,它们最终可以被处理(例如过滤或映射)。
-
-
Builder
s 在内部用于创建新的(连续的)集合。一个Combiner
是Builder
的一个特例同时代表Splitter
的对应项。而Splitter
在并行处理之前分割您的集合,aCombiner
之后将结果放在一起。您可以获得Combiner
通过调用.newCombiner
从并行集合(子集)中在上面。这是通过以下方法完成的:-
combine(that: Combiner[A, B]): Combiner[A, B]
:通过“合并”两个集合将您当前的集合与另一个集合结合起来Combiner
s。结果是一个新的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/