5

いくつかのタスクを並行して実行するためにいくつかの foreach ワーカーを含む R コードがあります。この目的のために foreach と doMC を使用しています。各 foreach ワーカーが新しいワーカーを募集し、並列化可能なコードの一部を配布できるようにしたいと考えています。

現在のコードは次のようになります。

require(doMC)
require(foreach)
registerDoMC(cores = 8)

foreach (i = (1:8)) %dopar% {
<<some code here>>
    for (j in c(1:4))  {
    <<some other code here>>
    }
}

次のような理想的なコードを探しています。

require(doMC)
require(foreach)
registerDoMC(cores = 8)

foreach (i = (1:8)) %dopar% {
<<some code here>>
    foreach (j = (1:4)) %dopar% {
    <<some other code here>>
    }
}

ここでdoSNOW と doMC を使用したマルチパラダイム並列処理の例を見ました(https://www.rmetrics.org/files/Meielisalp2009/Presentations/Lewis.pdf#page=17)。しかし、それが私が望んでいることをするかどうかはわかりません。

また、ネストされた foreachは、2 つのループをマージする必要があるため(こちらを参照)適用できないようですが、私の場合はこれは好ましくありません。2 番目のループは、コードの一部について最初のループを助けるだけです。間違っている場合は修正してください。

ありがとう。

4

1 に答える 1

7

foreach ループ内に foreach ループが含まれていても特に問題はありません。doSNOW ループ内の doMC ループの例を次に示します。

library(doSNOW)
hosts <- c('host-1', 'host-2')
cl <- makeSOCKcluster(hosts)
registerDoSNOW(cl)
r <- foreach(i=1:4, .packages='doMC') %dopar% {
  registerDoMC(2)
  foreach(j=1:8, .combine='c') %dopar% {
    i * j
  }
}
stopCluster(cl)

内側のループに doMC を使用するのは自然なことのように思えますが、好きなように使用できます。両方のループに doSNOW を使用することもできますが、その場合、外側の foreach ループ内で雪のクラスターを作成して停止する必要があります。

doMC ループ内で doMC を使用する例を次に示します。

library(doMC)
registerDoMC(2)
r <- foreach(i=1:2, .packages='doMC') %dopar% {
  ppid <- Sys.getpid()
  registerDoMC(2)
  foreach(j=1:2) %dopar% {
    c(ppid, Sys.getpid())
  }
}

結果は、合計 6 つのプロセスが doMC パッケージによってフォークされたことを示していますが、内側のループの本体を実行するのは 4 つだけです。

> r
[[1]]
[[1]][[1]]
[1] 14946 14949

[[1]][[2]]
[1] 14946 14951


[[2]]
[[2]][[1]]
[1] 14947 14948

[[2]][[2]]
[1] 14947 14950

もちろん、1 つのノードで多くのプロセスを開始しないように注意する必要があります。この種の入れ子は少しぎこちなく、入れ子演算子の開発につながりました。

于 2013-06-21T19:02:12.197 に答える