"取消注册"一个doParallel集群

Zac*_*ach 34 parallel-processing r parallel-foreach

如果我在foreach... %dopar%没有注册集群的情况下运行,foreach会发出警告,并按顺序执行代码:

library("doParallel")
foreach(i=1:3) %dopar%
  sqrt(i)
Run Code Online (Sandbox Code Playgroud)

产量:

Warning message:
executing %dopar% sequentially: no parallel backend registered 
Run Code Online (Sandbox Code Playgroud)

但是,如果我在启动,注册和停止集群后运行相同的代码,则会失败:

cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
  sqrt(i)
Run Code Online (Sandbox Code Playgroud)

产量:

Error in summary.connection(connection) : invalid connection
Run Code Online (Sandbox Code Playgroud)

有没有相反的registerDoParallel()清理群集注册?还是我坚持使用旧集群的鬼魂,直到我重新开始我的R会话?

/编辑:一些谷歌搜索揭示bumphunter:::foreachCleanup()bumphunter Biocondoctor包中的功能:

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>
Run Code Online (Sandbox Code Playgroud)

但是,此功能似乎无法解决问题.

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

foreach在哪里保留注册集群的信息?

Ste*_*ton 49

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

registerDoSEQ()
Run Code Online (Sandbox Code Playgroud)

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

我最初考虑包括一个"取消注册"功能,但由于我不能说服自己这是有用的,所以我决定将其删除,因为添加一个函数比删除一个函数要容易得多.

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

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

调用此函数后,将取消注册任何并行后端,并在调用时再次发出警告%dopar%.

  • 也许为`registerDoSeq` - >`unregister`添加别名是可行的方法? (3认同)
  • 这是一个很好的解决方案,因为我已经处理这个问题近两年了,但没有找到解决方案。但是,我确实有一个问题,如果我注册这个函数,那么我是在运行 foreach 循环之前在一行中单独运行“unregister”,还是将其放在循环中甚至循环之后?谢谢! (2认同)