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

时间:2015-02-11 19:04:12

标签: r foreach parallel-processing

这里的第一次海报。在发布之前,我按照推荐阅读常见问题和发布指南,所以我希望我以正确的格式发布我的问题。

我在R 64位控制台v.3.1.2中使用doParallel集群后端运行foreach()任务。在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控制台中的“停止”按钮),但没有通过&#39; stopCluster()&#39;来关闭群集。

我通过&#39; stopCluster()&#39;停止群集后再次运行相同的代码并注册一个新集群&#39; makeCluster()&#39;和&#39; registerDoParallel()&#39;任务运行正常。

是否有人遇到此错误或者可能有任何关于如何找出问题的线索/提示?该错误可能与不停止之前的doParallel群集有关吗?

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

干杯谢谢!

3 个答案:

答案 0 :(得分:7)

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

如果您确实停止了主人,我建议调用stopCluster,然后创建另一个群集对象,但请记住,以前的工作人员可能并不总是正常退出。最好验证工作进程是否已经死亡,如果不是,则手动终止它们。

答案 1 :(得分:0)

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

<div id="userShop">
  <p class="shoppingbaskets">
    <a href="RunFunction.jsp;jsessionid=123456789?shop=querty&basket=empty"><img src="image/empty.png" title="empty" width="50" height="50"></a>
    <a href="RunFunction.jsp;jsessionid=123456789?shop=querty&basket=full"><img src="image/full.png" title="full" width="50" height="50"></a>
    <a href="RunFunction.jsp;jsessionid=123456789?shop=querty&basket=semi"><img src="image/semi.png" title="semi" width="50" height="50"></a>
    <a href="RunFunction.jsp;jsessionid=123456789?shop=querty&basket=abandoned"><img src="image/abandoned.png" title="abandoned" width="50" height="50"></a>
    <a href="RunFunction.jsp;jsessionid=123456789?shop=querty&basket=completed"><img src="image/completed.png" title="completed" width="50" height="50"></a>
  </p>
</div>

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

答案 2 :(得分:0)

经过许多次尝试,我认为基于@Steve Weston的回答,我得到了一个潜在的解决方案。 出于某种原因,在stopCluster调用之前,您还需要调用registerDoSEQ()。

赞:

clus <- makeCluster()

... do something ...

registerDoSEQ()
stopCluster(clus)