R の foreach で並列処理するとき on.exit() が便利 #rstatsj

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

R の foreach パッケージで並列処理するとき、通常は次のように書きます。

R
library(doParallel) # foreach も読みこまれる

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

しかし、この書き方だと foreach の中でエラーが生じた場合、stopCluster(cl) が実行されないという問題が生じます。

そこで、tryCatch() を使って次のように書くことになります。

R
tryCatch({
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  foreach(i = 1:3) %dopar% {
    rnorm(i)
    if(i==2) stop("Error!")
  }
}, finally = {
  stopCluster(cl)
})

この書き方は、やや複雑で可読性が悪いです。

そこで、偉大なるごみ箱師に教えて頂いた on.exit() を使うやり方を紹介します。

R
ExecuteParallelProcess <- function() {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  on.exit(stopCluster(cl)) 
  foreach(i = 1:3) %dopar% {
    rnorm(i)
    if(i==2) stop("Error!")
  }
}

ExecuteParallelProcess()

このように書けば、関数を抜ける時に必ず stopCluster(cl) が実行されるようになるので安心です。
on.exit() 便利ですね。他にも使える場面が色々ありそうです。

関連記事