2016-10-18 20 views
5

在來自EPFL的並行編程課程中,提到了四種用於數據並行的抽象:Iterator,Builder,CombinerSplitter斯卡拉中的Builder,Combiner和Splitter是什麼?

我熟悉Iterator,但從未使用過其他三種。我已經看到其他Builder,CombinerSplitterscala.collection包裝。但是,我已經知道如何在實際開發中使用它們,特別是如何將它們與ListArray,ParArray等其他集合配合使用。請問誰能給我一些指導和示例?

謝謝!

+0

不幸的是,我不認爲他們在現實世界中看到很多用處。並行收集庫處於非常尷尬的境地:對於真正的大型數據集,您可以使用分佈式處理框架(如Spark)在多臺機器上處理它們。對於單機,您需要足夠大的數據集來克服跨不同線程/內核的同步開銷(請參閱[本文])(https://www.jayway.com/2011/10/02/experimenting-with-scala -parallel-集合/))。對於這些特殊情況,使用流式方法在內存使用方面會更好。 –

+0

並非每個庫中的每個組件都應該被使用或應該具有實際用途。一些(實際上大多數)組件應該是永遠不會與之交互的。 –

回答

6

這兩個性狀IteratorBuilder不是特定於並行性,但它們提供了基礎CombinerSplitter

  • 您已經知道了Iterator可以通過提供的方法hasNextnext幫你迭代超過連續集合。 A SplitterIterator的特例,並有助於將集合劃分爲多個不相交的子集。這個想法是在分裂之後,這些子集可以並行處理。您可以通過調用.splitter從並行集合獲得SplitterSplitter特徵的兩個重要方法如下:
    • remaining: Int:返回當前集合的元素數量,或者至少是該數字的近似值。這些信息很重要,因爲它用於決定是否值得分割集合。如果你的集合只包含少量的元素,那麼你需要按順序處理這些元素,而不是將集合分割成更小的子集。
    • split: Seq[Splitter[A]]:實際分割當前集合的方法。它返回不相交的子集(表示爲Splitter s),如果它是值得的,遞歸可以再次分裂。如果子集足夠小,它們最終可以被處理(例如過濾或映射)。
  • Builder s在內部用於創建新的(順序)集合。 A CombinerBuilder的特例,同時代表Splitter的對應部分。雖然Splitter在並行處理之前對您的收藏進行分割,但Combiner之後將收集結果。您可以通過在並行集合(子集)上調用.newCombiner來獲得Combiner。這是通過以下方法完成的:
    • combine(that: Combiner[A, B]): Combiner[A, B]:通過「合併」您的當前收藏和另一個收藏Combiner s。結果是一個新的Combiner,它代表最終結果,或再次與另一個子集合並(順便說一下:類型參數AB表示元素類型和類型或結果集合)。

的事情是,你並不需要實現甚至可以直接使用這些方法,如果你沒有定義一個新的並行集合。這個想法是,實現新並行集合的人只需要定義分離器和組合器,並免費獲得大量其他操作,因爲這些操作已經實現並利用分離器和組合器。

當然這只是對這些事情如何工作的膚淺描述。爲進一步閱讀,我建議您閱讀Architecture of the Parallel Collections Library以及Creating Custom Parallel Collections