16

Scalaの並列コレクションを使用して、事前に完全に評価Iterator せずに並列化することは何とか可能ですか?

Iteratorここでは、 、つまりmapとの関数変換を並列化することについて話していますflatMapIteratorこれには、 のいくつかの要素を事前に評価し、 を介して一部が消費されたら、さらに計算する必要があると思いますnext

私が見つけたのは、イテレータを aIterableまたはStreamせいぜい a に変換することだけです。次にStream、呼び出したときに完全に評価さ.parれます。

これがすぐに利用できない場合は、実装の提案も歓迎します。実装は、並列mapおよびをサポートする必要がありflatMapます。

4

4 に答える 4

6

これは古い質問だと思いますが、イテラタParIteratorライブラリの実装はあなたが探していたものを実行しますか?

scala> import com.timgroup.iterata.ParIterator.Implicits._
scala> val it = (1 to 100000).toIterator.par().map(n => (n + 1, Thread.currentThread.getId))
scala> it.map(_._2).toSet.size
res2: Int = 8 // addition was distributed over 8 threads
于 2015-06-11T23:58:49.243 に答える
2

ML から、反復子要素を並行してトラバースします。

https://groups.google.com/d/msg/scala-user/q2NVdE6MAGE/KnutOq3iT3IJ

Future.traverse私も同じような理由で引っ越しました。私のユース ケースでは、N 個のジョブを機能させ続けるために、ジョブ キューからの実行コンテキストのフィードを抑制するコードを作成しました。

私の最初の試みは、フィーダー スレッドをブロックすることでしたが、実行コンテキストでタスクを生成しようとするタスクもブロックする危険がありました。何を知っていますか、ブロッキングは悪です。

于 2013-06-19T04:58:19.457 に答える
0

あなたが求めているものを正確に従うのは少し難しいですが、おそらく次のようなものです:

val f = (x: Int) => x + 1
val s = (0 to 9).toStream map f splitAt(6) match { 
  case (left, right) => left.par; right 
}

これは、最初の 6 つの要素で f を並行して評価し、残りの要素に対してストリームを返します。

于 2013-06-19T05:00:50.960 に答える