問題タブ [parallel-foreach]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - Rでは、割り当てを使用して中間出力を保存する場合、foreachループ間の通信(doSNOW)の危険性はありますか?
割り当てを使用して中間出力 (p) を格納する関数を作成したいと考えています。この中間出力は、以下のステートメントで使用されます。doSNOW と foreach を使用してすべてを並列化したいのですが、その中間出力が forarch ループの反復間でやり取りされることを望んでいません。p[[i]]
大量のコードを変更する必要があるため、中間出力をリスト (例: ) に保存したくありません。
- 質問 1: foreach ループの別の反復で中間出力 (p) が使用される危険性はありますか?
- 質問 2:「はい」の場合、その危険はいつ発生し、どのように防ぐことができますか?
これが私が意味することの例です:
r - 「foreach」関数の仮引数の設定
foreach 関数の仮引数を設定しようとしています。.combine 引数を使用した簡単な例を示します。
関数の形式を変更する一般的なラッパーを作成しました(以下のコード)
ということで、foreach関数の形式を変えてみます
取得した新しいフォーマルを確認すると(予想どおり):
しかし、foreach.bind を呼び出すと、.combine 変数が設定されていないようにすべてが機能します。たとえば、次のように宣言します。
そして呼び出す:
私が言ったように、 .combine パラメータは正式に設定されていませんでした。
一方、元の関数を呼び出すと、次のようになります。
とにかく、この場合に何が起こっているのか誰か説明してもらえますか? または foreach 関数を「バインド」する他の方法を教えてください。
r - エラー時に早期終了する並列マルチコア プライア
.parallel=TRUE
関数の呼び出しで指定するplyr
と、最初の評価で既にエラーがスローされていても、頑固にすべてのインスタンスが評価されます。
上記の例は、私のマシンでほぼ 1 分間実行され、途中でいくつかのプロセスが生成されます。.parallel=TRUE
を省略すると、即座に終了します。
llply
最初のエラーが発生するとすぐに終了する方法はありますか?
r - ループ R の並列
for ループ内で関数を呼び出しています。
このループを並列化するにはどうすればよいですか。foreach と dopar を使用すると、添字エラーが発生します。
r - R の並列 k-means
R を使用してコードの一部を並列化する方法を理解しようとしています。したがって、次の例では、k-means を使用して、2,3,4,5,6 の中心を使用してデータをクラスター化し、20 回の反復を使用します。コードは次のとおりです。
反復と中心を同時に並列化するにはどうすればよいでしょうか? k-means からのすべての出力をすべてのイテレーションとセンターにわたって保持したいと仮定して、出力を追跡する方法は?
r - R で複数のコアと疎行列を操作する
ゼロの数が多い大きな行列を必要とするプロジェクトに取り組んでいます。残念ながら、これらの行列の一部は 1e10 を超える要素を持つことができるため、RAM の制約により、「標準」の R 行列を使用することはできません。また、計算には非常に長い時間がかかる可能性があり、実際にはそうすべきではないため、複数のコアで作業する必要があります。
これまでのところ、私はパッケージで作業しておりforeach
、結果 (標準行列で提供されます) を後で疎行列に変換しました。もっとスマートな方法があるに違いないと思わずにはいられません。
これは、私がこれまで行ってきたことの最小限の例です。
ラムダはすべて非常に小さいため、5 番目の要素ごとに約 0 と異なるだけであるため、結果をスパース行列に格納することが賢明です。
残念ながら、反復回数を 1e6 から少なくとも 1e7 に増やす必要が生じたため、foreach
ループによって生成される行列が大きすぎて 8 GB の RAM に格納できなくなりました。ここでやりたいことは、タスクをそれぞれ 1e6 回の反復を含むステップに分割し、これらを 1 つのスパース マトリックスに結合することです。
私は今、アイデアとして次のことを考えています。
正常に動作しますが、ラムダを何らかの値に修正する必要がありました。私のアプリケーションでは、ラムダ ベクトルの i 番目の要素に平均が等しいポアソン分布から得られる i 番目の行の値が必要です。これは明らかにforeach
ループでうまく機能しましたが、適用ループで機能させる方法をまだ見つけていません。
私の質問は次のとおりです。
- 適用関数に、それが操作している行を「認識」させ、対応する引数を関数に渡すことは可能ですか?
- 標準マトリックスを作成し、次のステップでそれをスパース マトリックスに変換する必要なく、foreach およびスパース マトリックスを操作する方法はありますか?
- 上記のいずれにも当てはまらない場合、タスクを R のスレーブ プロセスに手動で割り当てる方法はありますか?まばらなベクトルであり、最後のステップでこれらを結合するだけです。
r - R for loop が foreach を使用する場合よりも 10 倍遅いのはなぜですか?
これは本当に私の心を吹き飛ばしています。基本的なループは、私のコンピューターでは 8 秒ほどかかります。
非並列モードで使用するforeach
と、わずか0.7秒しかかかりません!!!
結果は同じですが、foreach
どういうわけか基本的な R よりもはるかに速く到達することができました! 基本的な R の非効率性はどこにありますか?
これはどのように可能ですか?
実際、これとはまったく逆の結果が得られました。