【问题标题】:What are Builder, Combiner, and Splitter in scala?Scala 中的 Builder、Combiner 和 Splitter 是什么?
【发布时间】:2016-10-18 02:57:19
【问题描述】:

在 EPFL 的并行编程课程中,提到了数据并行的四个抽象:IteratorBuilderCombinerSplitter

我对@9​​87654326@很熟悉,但没用过其他三个。我在scala.collection 包下看到了其他特征BuilderCombinerSplitter。但是,我知道如何在实际开发中使用它们,特别是如何与其他集合(如ListArrayParArray 等)协作使用它们。谁能给我一些指导和示例?

谢谢!

【问题讨论】:

  • 不幸的是,我认为它们在现实世界中没有多大用处。并行集合库处于一个非常尴尬的位置:对于真正的大型数据集,您将使用 Spark 等分布式处理框架在多台机器上处理它们。对于单台机器,您将需要足够大的数据集来克服跨不同线程/内核同步的开销(请参阅this article)。对于那些特殊情况,使用流式方法在内存使用方面会好得多。
  • 并非任何库中的每个组件都应该使用或应该有实际用途。一些(实际上是大多数)组件应该永远不会与之交互。

标签: scala collections parallel-processing


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多