【发布时间】:2014-09-25 16:33:46
【问题描述】:
如果我在没有注册集群的情况下运行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 将注册集群的信息保存在哪里?
【问题讨论】:
-
你不应该在 foreach() 操作之后使用 stopCluster(cl) 吗?叉子应该关闭,不需要删除 cl 对象。
-
@Patrick McCarthy 通常你会这样做,是的。关键是,fork 关闭后,
foreach仍在寻找停止的集群。 -
也许我没有正确地关注你。预期的行为是在集群停止后运行
foreach,或者违背您的意愿集群在foreach完成之前提前停止,或者其他什么?重读,您希望它运行,但在集群停止的情况下会出现警告? -
@Patrick McCarthy 我想返回到 foreach 运行并显示警告,而不是在取消注册集群后出现错误。
标签: r parallel-processing parallel-foreach