foreach() 中带有 doParallel 集群 (R) 的未知错误(工作程序初始化失败:21)

Unknown error (worker initialization failed: 21) in foreach() with doParallel cluster (R)

第一次张贴在这里。在发布之前,我按照建议阅读了常见问题解答和发布指南,因此我希望我以正确的格式发布我的问题。

我是 运行 foreach() 任务,使用 R 64 位控制台 v.3.1.2 中的 doParallel 集群后端。 on Windows 8. 相关包为 foreach v. 1.4.2 和 doParallel v. 1.0.8.

一些示例代码让您了解我在做什么:

out <- foreach (j = 1:nsim.times, .combine=rbind, .packages=c("vegan")) %dopar% {

b<-oecosimu(list.mat[[j]], compute.function, "quasiswap", nsimul=nsim.swap) ## where list.mat is a list of matrices and compute.function is a custom function
..... # some intermediate code
return(c(A,B)) ## where A and B are some emergent properties derived from object b from above

}

在我的一项任务中,我遇到了一个我以前从未见过的错误。我试图在线搜索错误,但找不到任何线索。

错误是:

Error in e$fun(obj, substitute(ex), parent.frame(), e$data) :
worker initialization failed: 21

有一次我遇到这个错误,我 运行 停止了上一个任务(使用 R 控制台中的停止按钮)后的代码,但没有通过 'stopCluster()' 关闭集群。

我 运行 在通过 'stopCluster()' 停止集群并注册新集群 'makeCluster()' 和 'registerDoParallel()' 以及任务 运行 后再次使用相同的代码.

有没有人遇到过这个错误,或者可能 clues/tips 关于我如何解决这个问题?该错误是否与未停止之前的 doParallel 集群有关?

非常感谢任何帮助或建议!

干杯,谢谢!

我同意问题是由停止主服务器并继续使用处于损坏状态的集群对象引起的。到集群 worker 的套接字连接中可能存在未读数据,导致 master 和 worker 不同步。您甚至可能无法调用 stopCluster,因为它也会写入套接字连接。

如果你确实停止了 master,我建议调用 stopCluster 然后创建另一个集群对象,但请记住,以前的 worker 可能并不总是正确退出。最好先验证worker进程是否挂了,没挂就手动杀掉。

我遇到了同样的问题,事实上你需要在 foreach 循环之前添加:

out <- matrix()

它将初始化您的 table 并避免此错误。它确实对我有用。

经过多次试验,我认为我根据@Steve Weston 的回答找到了一个潜在的解决方案。 由于某些原因,在调用 stopCluster 之前,您还需要调用 registerDoSEQ()。

像这样:

clus <- makeCluster()

... do something ...

registerDoSEQ()
stopCluster(clus)