37

クラスターを登録せずに実行するforeach... %dopar%と、foreach で警告が発生し、コードが順番に実行されます。

library("doParallel")
foreach(i=1:3) %dopar%
  sqrt(i)

収量:

Warning message:
executing %dopar% sequentially: no parallel backend registered 

ただし、クラスターを開始、登録、および停止した後にこの同じコードを実行すると、失敗します。

cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
  sqrt(i)

収量:

Error in summary.connection(connection) : invalid connection

registerDoParallel()クラスター登録をクリーンアップする反対の方法はありますか? それとも、R セッションを再起動するまで、古いクラスターのゴーストが残るのでしょうか?

/編集: いくつかのグーグルは、 bumphunter Biocondoctor パッケージのbumphunter:::foreachCleanup()機能を明らかにします:

function () 
{
    if (exists(".revoDoParCluster", where = doParallel:::.options)) {
        if (!is.null(doParallel:::.options$.revoDoParCluster)) 
            stopCluster(doParallel:::.options$.revoDoParCluster)
        remove(".revoDoParCluster", envir = doParallel:::.options)
    }
}
<environment: namespace:bumphunter>

ただし、この機能は問題を解決していないようです。

library(bumphunter)
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
bumphunter:::foreachCleanup()
foreach(i=1:3) %dopar%
  sqrt(i)

foreach は、登録されたクラスターに関する情報をどこに保持しますか?

4

2 に答える 2

58

foreach バックエンドを「登録解除」する唯一の公式な方法は、シーケンシャル バックエンドを登録することです。

registerDoSEQ()

使用するバックエンドを宣言する必要があるため、これは理にかなっています。そのため、使用するバックエンドを「宣言解除」する方法を提供する意味がありませんでした。代わりに、デフォルトであるシーケンシャル バックエンドを使用することを宣言します。

もともと「登録解除」機能を入れようと思っていたのですが、機能を削除するよりも追加した方がずっと簡単なので、自分では使い物にならないと思ったので、削除することにしました。

そうは言っても、あなたがする必要があるのforeach:::.foreachGlobalsは、 foreach がそのすべての状態を保持する場所であるすべての変数を削除することだけだと思います:

unregister <- function() {
  env <- foreach:::.foreachGlobals
  rm(list=ls(name=env), pos=env)
}

この関数を呼び出した後、並列バックエンドは登録解除され、呼び出された場合は警告が再度発行さ%dopar%れます。

于 2014-08-04T00:01:28.893 に答える
4
    cl <- makeCluster(2)
    registerDoParallel(cl)
    on.exit(stopCluster(cl))

これは私にとってはうまくいきました。

于 2016-01-20T04:23:38.420 に答える