5

最初に、すべてのコレクションクラスにparメソッドを追加してコレクションを適合する並列データ構造に変換すると仮定しました(mapはScala 2.8の要素タイプのベストコレクションを返します)。Scalaで並列コレクションを使用する際に推奨される方法は何ですか?

parメソッド(例えば、配列)をサポートしているコレクションクラスもあれば、toParSeq,メソッド(例えば、リスト)を持つコレクションクラスもあるようです。 Arrayは頻繁に使用されたり推奨されたりしていないので、少し奇妙です。

その理由は何ですか? 「正しいこと」をしているすべてのコレクションクラスでparを利用できるようにするのは良いことではないでしょうか?

私は並行して処理される可能性のあるデータがある場合、どのタイプを使用しますか?形質の種類はscala.collectionか、実装の種類は直接ですか?

これは並列化するほうが安価なので、今はArraysを好むべきですか?

答えて

5

リストは並列処理にはあまり適していません。その理由は、リストの最後に到達するためには、すべての要素を1つずつ調べなければならないからです。したがって、リストをイテレータとして扱うだけでよいので、toParIterableのようなより一般的なものを使うこともできます。

高速インデックスを持つコレクションは、並列処理に適しています。これには、LinearSeqOptimizedとツリーとハッシュテーブルを実装するものが含まれます。 Arrayはあなたが得ることができるほど速いインデックスを持っているので、それはかなり自然な選択です。 ArrayBufferparメソッドはParArrayを返す)などのものを使用することもできます。

+0

これは、 'SeqLike'に' .sorted'しかないようですので、 'items.sorted'の代わりに' items.toSeq.sorted'を実行する必要があります。なぜ 'items'が並列化できないときに' items.toArray.par'を実行するように指示するのではなく、 '.toParIterable'メソッドをすべて持っているのですか? – Steve

+0

@Steve - 'toParIterable'メソッドは、基になるデータのコピーを作る必要がない場合があります。ゆっくりとしていても、ときには良い妥協点になることがあります(たとえば、リストやトラバースがリストの各要素の計算と比較して高速な場合)。 –

関連する問題