2016-07-12 9 views
0

DoMCを使用して並列foreachループを構築しようとしていますが、奇妙な振る舞いがあります。コードは、このR for foreach forループを含む奇妙な動作

for (file in files) { 
do stuff 
for (extra in extras) { 
do some heavy stuff 
} 
} 
  • IはDoMC又はDoParallelをロードすると、ループは一つのコアを利用開始するが、私は%をforeachのためのスイッチのループのときに第二のループでは、すべての4つのコア
  • を利用するように見えますdo%私はまったく同じ動作をします。
  • 外側のループにforeachを使用し、内側をforループとして残すと、スクリプトは遅くなります。それは4jobsパラレルで始まり、すべて停止し、徐々にCPU使用率が低下します。

私が望むのは、トップループと内部ループを並列化することです。誰が何が起こっているのか知っていますか?私は過去にforeachとdoMCを使用していましたが、以前はこの問題を抱えていませんでした。

答えて

1

それはあなたが起こっていくつかのことを持っているように見えますが、確かにここでは足りない。

あなたはRStudioからこれを使用している場合、それはうまく動作しない場合があり、それはdoMCの規定の制限です。それをR64ビットからまっすぐに走らせてみてください。

あなたはrequire(doMC)に必要かlibrary(doMC)パッケージを呼び出していますが、あなたのマシンに登録したり、それは4がどのように多くのコアで実行するように指示されていることを右

registerDoMC(4) 

を動作しませんする必要があります。あなたが何も言っていなければ、あなたのコアの1/2を使うことを試みます。

そして、あなたは、上記の完全なコードを持っていない、適切な形式は次のとおりです。

foreach(file in files) %dopar% { stuff to do }

あなたが明示%dopar%コマンドを使用して並列処理を行うためにそれを伝える必要があります。 1つの領域にすべてのコアを使用し、別の領域にコアを使用しない場合は、機能またはコードの別々の部分のコア数を指示するオプションを設定する必要があります。しかし、4を使用する外部ループと2を使用する内部ループを伝えると、外側ループで4に設定し、それ自体を管理させるよりも遅くなる可能性があります。私はそれがハンドオフを達成する方法について100%明確ではない、見るために実験する。

は、コアの数を変更するには、次の行を追加します。

options(cores=2)

私はこれが役に立てば幸い!

+0

答えはよかったです。私は問題が異なるので、新しい質問を投稿しなければならないと考えました。 – Michael

+0

多くの内部的な計算と変換を伴う非常に大きなデータセットを扱う場合、CPUが動作している速度を上げて高速メモリが膨らんでいる可能性が高いです。 'rm()'と 'gc()それがメモリをクリアするかどうかを確認するために、新しいマルチコアプログラムに追いつくことができるかどうかを確認するために、永続メモリ内の配列、フレーム、またはファイルに追加された後に、中間データを消去します。 – sconfluentus

関連する問題