在EPFL的并行编程课程中,提到了四个数据并行的抽象:Iterator
,Builder
,Combiner
和Splitter
。
我熟悉Iterator
,但从未使用其他三个。我在Builder
包下看到了其他特征Combiner
,Splitter
和scala.collection
。但是,我知道如何在实际开发中使用它们,特别是如何与其他集合(如List
,Array
,ParArray
等合作使用它们。有谁可以请给我一些指导和例子?
谢谢!
答案 0 :(得分:9)
两个特征Iterator
和Builder
并非特定于并行性,但它们为Combiner
和Splitter
提供了基础。
Iterator
可以通过提供方法hasNext
和next
来帮助您迭代顺序集合。 Splitter
是Iterator
的特例,有助于将集合划分为多个不相交的子集。这个想法是在分裂之后,可以并行处理这些子集。您可以通过在其上调用Splitter
从并行集合中获取.splitter
。 Splitter
特征的两个重要方法如下:
remaining: Int
:返回当前集合的元素数,或者至少是该数字的近似值。这些信息很重要,因为它用于决定分割集合是否值得。如果您的集合只包含少量元素,那么您希望按顺序处理这些元素,而不是将集合拆分为更小的子集。split: Seq[Splitter[A]]
:实际拆分当前集合的方法。它返回不相交的子集(表示为Splitter
s),如果它值得,则可以递归地再次分割。如果子集足够小,则最终可以处理它们(例如,过滤或映射)。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。