0

DoMC を使用して並列 foreach ループを構築しようとしていますが、奇妙な動作がいくつか発生しています。コードは次のようになります

for (file in files) {
do stuff
for (extra in extras) {
do some heavy stuff
}
}
  • DoMC または DoParallel をロードすると、ループは 1 つのコアを使用し始めますが、2 番目のループでは 4 つのコアすべてを使用します
  • for ループを foreach %do% に切り替えると、まったく同じ動作が得られます。
  • 外側のループに foreach を使用し、内側を for ループのままにすると、スクリプトが遅くなります。4 ジョブ並列で開始し、すべて停止し、徐々に CPU 使用率が減少します。

私が望むのは、内側の秒ではなく、上のループを並列化することです。誰が何が起こっているのか知っていますか?過去に foreach と doMC を使用したことがありますが、これまでこの問題が発生したことはありません。

4

1 に答える 1

1

いくつかのことが起こっているようですが、確認するには十分ではありません:

RStudio からこれを使用している場合、うまく機能しない可能性があります。これは、doMC の規定の制限です。R 64 ビットから直接実行してみてください。

require(doMC)パッケージを呼び出すか呼び出す必要がありますが、マシンに登録するlibrary(doMC)必要もあります。そうしないと、正しく機能しません

registerDoMC(4) 

その 4 は、実行するコアの数を示しています。何も言わなければ、コアの 1/2 を使用しようとします。

上記の完全なコードはありません。適切な形式は次のとおりです。

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

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

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

options(cores=2)

これが役立つことを願っています!

于 2016-07-12T15:49:31.093 に答える