大仏様の
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%
に書き替えなくてもいいということだ。
これで並列化の切り替えを自由に行えるようになった。
ご参考まで。