LoginSignup
8
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-27

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() 便利ですね。他にも使える場面が色々ありそうです。

関連記事

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6