"注销"一个doParallel集群

时间:2014-08-02 17:39:25

标签: r parallel-processing parallel-foreach

如果我在没有注册集群的情况下运行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会话之前,我是否坚持使用旧群集的幽灵?

/ edit:一些谷歌搜索显示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在哪里将信息保存在已注册的群集中?

2 个答案:

答案 0 :(得分:43)

“取消注册”foreach后端的唯一官方方法是注册顺序后端:

registerDoSEQ()

这对我来说是有道理的,因为你应该声明要使用哪个后端,所以我没有看到提供“未声明”后端使用方法的任何意义。相反,您声明要使用顺序后端,这是默认值。

我最初考虑过包含“取消注册”功能,但由于我无法说服自己这是有用的,所以我决定将其删除,因为添加功能比删除功能要容易得多。

话虽如此,我认为您需要做的就是从foreach:::.foreachGlobals删除所有变量,这是foreach保持其所有状态的地方:

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

调用此函数后,任何并行后端都将被取消注册,如果调用%dopar%,将再次发出警告。

答案 1 :(得分:3)

    cl <- makeCluster(2)
    registerDoParallel(cl)
    on.exit(stopCluster(cl))

这对我来说很好。