foreach の registerDoSEQ() について #rstatsj

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

大仏様の
foreachパッケージで、並列化する/しないを綺麗に書き分ける
を読んで、私がよく使っている registerDoSEQ() について書き留めておこうと思った。

例えば、次のようなコードがあったとして

cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
  sqrt(i)
}
stopCluster(cl)

デバッグしたいときには並列化を解除したくなったりする。で、こう

# cl <- makeCluster(detectCores())
# registerDoParallel(cl)
foreach(i = 1:3) %do% {
  sqrt(i)
}
# stopCluster(cl)

書き換えたりするのはめんどくさい。

そこで、registerDoSEQ() という関数があって、これは registerDoParallel() の代わりに使うと foreach を強制的に並列化解除してくれる。

これで並列化を切り替えたいときには、デバッグフラグ debug を用意して次のように書けばよい。

debug <- TRUE

if(debug) {
  cl <- makeCluster(0)
  registerDoSEQ()
} else {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
}
foreach(i = 1:3) %dopar% {
  print(i) # debug print
  sqrt(i)
}
stopCluster(cl)

ポイントは %dopar%%do% に書き替えなくてもいいということだ。
これで並列化の切り替えを自由に行えるようになった。

ご参考まで。

関連記事