2013-02-22 7 views
7

私はスカラー並列を使用して実行時間を高速化しようとしています。Javaで変換されたリストを不変に反復するときにスカラ並列を使用する

var imList = scala.collection.JavaConversions.asScalaBuffer(normalQLFolderList) 

、その後、私が使用して繰り返し処理を行う場合、複数のコアを利用するには:だから私は使用不変のものにするJavaのArrayListを変換する

for (i <- imList .par) { 
} 

私はスカラ座の利点を取っています平行して正しい方法で?この場合、リストを反復処理します。 asScalaBufferに大きなパフォーマンスヒットがありますか?

+2

Scala'ish方法はimList.par.map(X => yourFunction(x))を – Rajesh

+0

だろう、私は完全にそれに同意しない:とは根本的に間違っているものはありませんScalaの 'for'ループ - これは同じことを言う別の方法です。明示的なforループは、特にフラットマッピングの場合に、より明確になることがあります。 –

答えて

5

一定時間内にパラレルに変換できるコレクションには、可変で不変のハッシュマップやハッシュセット、範囲、ベクトル、配列などがあります。 Javaからのコレクションのラッパーを含む他のすべてのコレクションタイプの場合は、parを呼び出すと、コレクションの内容が並列化により適した形式にコピーされます。

この

は、より詳細にここで説明されています

http://docs.scala-lang.org/overviews/parallel-collections/conversions.html

しかし、forブロックがどのように大きなコレクションがあり、そしてどのように高価に応じて、この変換のために支払うことを完全に合理的であるかもしれません。並列ブロックforが各要素ごとに処理するほど、変換のコストはより多く償却されます。

私は、各要素の計算に何か重要なものがあれば(少なくとも新しいオブジェクトを作成するなど)、変換の支払いは意味をなさないと言いますが、シーケンシャルバージョンとパラレルのパフォーマンス差を測定することをお勧めしますparを呼び出す含まれたバージョン:

http://docs.scala-lang.org/overviews/parallel-collections/performance.html

関連する問題