在EPFL的并行编程过程中,提出了数据并行的四种抽象:Iterator、Builder、Combiner和Splitter。
我熟悉Iterator,但从未使用过其他三种。我见过Builder、Combiner和Splitter在scala.collection包下的其他特性。然而,我知道如何在现实世界的开发中使用它们,特别是如何与其他集合(如List、Array、ParArray等)协作使用它们。请给我一些指导和示例。
谢谢!
发布于 2016-10-18 13:12:35
Iterator和Builder这两个性状并不是特定于并行性的,但它们为Combiner和Splitter提供了基础。
Iterator可以通过提供hasNext和next方法来帮助您迭代顺序集合。Splitter是Iterator的特例,它有助于将集合划分为多个不相交的子集。其思想是,在分裂后,这些子集可以并行处理。通过调用并行集合上的Splitter,您可以从并行集合中获得一个.splitter。Splitter特征的两种重要方法是:remaining: Int:返回当前集合的元素数,或至少返回该数的近似值。这个信息很重要,因为它用于决定是否值得拆分集合。如果您的集合只包含少量的元素,那么您希望按顺序处理这些元素,而不是将集合分割成更小的子集。split: Seq[Splitter[A]]:实际拆分当前集合的方法。它返回不相交子集(表示为Splitters),如果值得的话,可以递归地拆分这些子集。如果子集足够小,它们最终可以被处理(例如,过滤或映射)。
Builder在内部用于创建新的(顺序的)集合。Combiner是Builder的特例,同时表示Splitter的对应项。当Splitter在并行处理集合之前将其拆分,Combiner则会将结果放在一起。通过调用并行集合(子集)上的Combiner,您可以从它获得一个.newCombiner。这是通过以下方法完成的:combine(that: Combiner[A, B]): Combiner[A, B]:通过“合并”两个Combiner的方法将当前集合与另一个集合组合在一起。结果是一个新的Combiner,它要么表示最终结果,要么再次与另一个子集组合(顺便说一句:类型参数A和B表示元素类型和类型或结果集合)。
问题是,如果不定义新的并行集合,则不需要实现这些方法,甚至不需要直接使用这些方法。其思想是,实现新的并行集合的人只需要定义拆分器和组合器,并免费获得大量其他操作,因为这些操作已经实现,并且使用了拆分器和组合器。
当然,这只是对这些事情如何运作的一种肤浅描述。为了进一步阅读,我建议阅读并行馆藏库的体系结构和创建自定义并行集合。
https://stackoverflow.com/questions/40098794
复制相似问题