foreach循环中mclapply的R错误

时间:2016-02-18 19:46:35

标签: r parallel-processing parallel-foreach mclapply

基于this post here,我尝试编写一个脚本,如下所示:

library(parallel)
library(doParallel)

cl<-makeCluster(2,outfile='')
registerDoParallel(cl)

foreach(i=1:5, .packages='parallel') %dopar% {
    system.time(mclapply(1:10, function(x){rnorm(1e5)},mc.cores=2))
}

stopCluster(cl)

它起了作用,但现在却抛出了错误代码:

Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(socklist[[n]]) : error reading from connection
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

知道发生了什么事吗?甚至可以将mclapply放入foreach循环中吗?

编辑:我也想说这是在一台8核机器上,而不是集群。

2 个答案:

答案 0 :(得分:4)

我只能使用&#34; parallel&#34;在我的Linux机器上重现您的问题。 R 3.2.3中的包装:

library(parallel)
cl <- makeCluster(2)
clusterEvalQ(cl, library(parallel))
fun <- function(i) {
  mclapply(1:10, function(x) rnorm(1e5), mc.cores=2)
  0
}
clusterApplyLB(cl, 1:5, fun)

从我的调试会话中看来,主服务器和工作服务器之间的套接字连接可能会被破坏,这可能导致工作程序在尝试&#34;反序列化&#34;来自损坏的套接字连接的数据。

有趣的是,我可以通过使用&#34; multicore&#34;来实现这个例子。包而不是&#34; parallel&#34;。我使用以下命令从RForge.net安装了多核0.1-8:

> install.packages('multicore',,'http://www.rforge.net/')  

然后,我加载了多核&#34;而不是&#34; parallel&#34;关于工人:

clusterEvalQ(cl, library(multicore))

然后这个例子工作正常。您可以更改foreach循环以使用.packages='multicore'选项。

就我追踪它而言。我的猜测是,孩子的过程是由&#34; mclapply&#34; in&#34; parallel&#34;以某种方式破坏了他们继承的套接字连接,但是我还没有查看代码,看看这个理论是否合理。

我猜您的选择是:

  1. 不要使用&#34; mclapply&#34;在&#34; doParallel&#34; foreach循环
  2. 使用&#34; mclapply&#34;来自&#34;多核0.1-8&#34;而不是&#34; parallel&#34;
  3. 将此问题报告给R-Core
  4. 你必须做额外的工作才能向R-Core报告这个问题,但希望我的例子会有所帮助。

答案 1 :(得分:0)

我在使用 mclapply 进行并行计算时遇到过类似的错误。它以非常随机的方式偶尔发生。您可以按照其他答案中的建议进行操作,但我所做的一个快速修复是让算法捕获此错误并重新运行命令。大多数情况下,如果您再次运行它,它就会起作用。