R foreachループがdoParallelバックエンドでどのようにロードバランシングを行うかを変更する方法はありますか?非常に異なる実行時間を持つタスクを並列化すると、すべてのノードで発生する可能性がありますが、1つはタスクを終了しますが、最後のタスクはまだいくつかのタスクがあります。ここにおもちゃの例があります:R foreachループのロードバランシング
library(foreach)
library(doParallel)
registerDoParallel(4)
waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1)
w = iter(waittime)
foreach(i=w) %dopar% {
message(paste("waiting",i, "on",Sys.getpid()))
Sys.sleep(i)
}
基本的には、コードレジスタ4コアです。各ループについて、i
は、waittime[i]
秒待つことです。ただし、foreachループの負荷分散は、既定では、上記の例では、登録されたコアの数の長さを持つセットにタスクの総数を分割するように見えるため、最初のコアはwaittime
= 10、他の3人はwaittime
= 1のタスクを受け取り、最初のタスクが完了する前にこれらの3つのコアがすべてのタスクを完了するようにします。
foreach()
にタスクを1つずつ配布する方法はありますか?すなわち、上記の場合、最初の4つのタスクが4つのコアに分散され、次にそれぞれの次のタスクが次の使用可能なコアに分散されることが望まれます。
ありがとうございました。
はい。それでおしまい。どうもありがとう。 – xraynaud