6

オブジェクトの配列がある場合、(パフォーマンス上の理由などから) 適切なオブジェクトの一部を更新 (置換) することが望ましい場合がよくあります。たとえば、整数の配列がある場合、負の整数を正の整数に置き換えたい場合があります。

// Faster for primitives
var i = 0
while (i < a.length) {
  if (a(i) < 0) a(i) = -a(i)
  i += 1
}

// Fine for objects, often okay for primitives
for (i <- a.indices) if (a(i) < 0) a(i) = -a(i)

並列コレクション ライブラリを使用して、このような変更を行う標準的な方法は何ですか?

4

3 に答える 3

6

並列配列が考慮される限り、それは見落としです。並列配列の並列transformは、おそらく次のリリースに含まれるでしょう。

ただし、並列範囲を使用してそれを行うことができます。

for (i <- (0 until a.length).par) a(i) = computeSomething(i)

すべての変更可能なコレクションがこの方法で変更できるわけではないことに注意してください。一般に、その場で何かを変更したい場合は、適切に同期されていることを確認する必要があります。この場合、これは配列の問題ではありません。異なるインデックスは異なる配列要素を変更するからです (そして、変更は最後に呼び出し元に表示されます。これは、並列操作の完了により、すべての書き込みが呼び出し元に表示されることが保証されるためです)。

于 2011-05-26T18:32:33.017 に答える
2

インデックスを配列に保持して変換し、 foreach を実行して、インデックスを指定して配列内の 1 つのセルを変更する並列コレクションを作成するのはどうでしょうか。

そうすれば、より細かく制御でき、配列の 4 分の 4 で動作する 4 つのワーカーを作成できます。単一の整数記号を単純に反転するだけでは、おそらく並列計算を正当化するのに十分な作業ではないからです。

于 2011-05-26T17:41:13.103 に答える
2

順次可変コレクションにはtransform、インプレースで動作するメソッドがあります。

並列可変コレクションにはこれらのメソッドがありませんが、その背後に理由があるのか​​ 、それとも単なる見落としなのかはわかりません。

私の答えは、あなたは現在運が悪いということですが、もちろん自分で書くこともできます.

これがもう少し議論された後にチケットを提出するのは理にかなっているでしょうか?

于 2011-05-26T16:47:12.800 に答える