R

foreach の registerDoSEQ() について #rstatsj

More than 3 years have passed since last update.

大仏様の

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% に書き替えなくてもいいということだ。

これで並列化の切り替えを自由に行えるようになった。

ご参考まで。


関連記事