R中的doParallel错误:序列化中的错误(数据,节点$ con):写入连接时出错

时间:2015-02-13 15:40:38

标签: r parallel-processing

这是我的代码。循环中的东西是有道理的。

        library(foreach)
        library(doParallel)
        cl <- makeCluster(7)
        registerDoParallel(cl) 

        elasticitylist = foreach(i=1:nhousehold) %dopar% {

            pricedraws = out$betadraw[i,12,] 
            elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws)
            elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat)

        } 

我一直收到这个错误:

Error in serialize(data, node$con) : error writing to connection

我知道我有足够的核心(有20个)。有人能帮忙吗?似乎答案无处可在文档中找到!

当我在我的unix服务器上运行ps -ef| grep user时,我得到:

/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

6 个答案:

答案 0 :(得分:10)

主进程调用函数serializeunserialize,以便在使用套接字集群时与工作进行通信。如果从这些函数中的任何一个中获得错误,通常意味着至少有一个工作者已经死亡。在Linux机器上,它可能已经死亡,因为机器几乎没有内存,因此内存不足的杀手决定杀死它,但还有很多其他的可能性。

我建议您在创建群集对象时使用makeCluster outfile=""选项,以便显示worker的输出。如果你很幸运,你会在工作人员死亡之前收到一条错误消息,以帮助你解决问题。

答案 1 :(得分:4)

当我尝试使用机器的所有8个内核时,我遇到了同样的问题。当我打开一个,然后问题就消失了。我相信系统需要1个核心才能保持打开的服务任务,否则你会收到错误:

library(doParallel)
#Find out how many cores are available (if you don't already know)
cores<-detectCores()
#Create cluster with desired number of cores, leave one open for the machine         
#core processes
cl <- makeCluster(cores[1]-1)
#Register cluster
registerDoParallel(cl)

答案 2 :(得分:0)

收到此错误消息后,我将代码更改为非并行for循环。然后我收到错误消息&#34;无法分配大小为*** Gb&#34;的向量。我想并行失败可能是由同样的原因引起的,只是不同的错误信息。

答案 3 :(得分:0)

我收到了以下类似的错误,我提前终止了模型训练,然后又尝试再次运行它。这是一个例子,我使用snapshot.after.ref.parent.parent.child('liquidAssets').set(newLiquidAssets).then( function(){ snapshot.after.ref.parent.parent.child('transactions').push({ timestamp: tinestampOfTransaction, transaction: transaction, stock: tickerSymbol, volume: sharesToBuy, price: currPrice }).then( function(){ return 1; }); }); 包来训练模型,但我认为它适用于涉及并行处理的任何应用程序。

caret

我关闭了群集并重新启动它:

> cluster <- makeCluster(10)
> registerDoParallel(cluster)
> train(... , trControl = trainControl(allowParallel = T)
# Terminated before complete
> train(... , trControl = trainControl(allowParallel = T)
Error in serialize(data, node$con) : error writing to connection

再次运行模型时没有看到错误。有时将其关闭并重新打开可能是解决方案。

答案 4 :(得分:0)

我在mclapply函数中遇到了类似的问题。我不知道原因,因为错误是随机出现的。但是,我正在使用这种变通方法,对我来说效果很好:

for(....( {
    .
    .
    .
 
    error_count <- 1
    while (error_count <= 3) {
      error <- try(
        FUNCTION THAT USES mclapply
      )
  
      if(class(error) != "try-error") break
  
      error_count <- error_count + 1
      invisible(gc()); Sys.sleep(1)
    }
    if(class(error) == "try-error") next

    .
    .
    .
}

到目前为止,当错误发生时,它将在第二次while迭代中起作用。

答案 5 :(得分:0)

您分配的每个内核都会消耗内存。所以更多的内核意味着需要更多的内存,一旦用完它,你就会收到这个错误。所以我的建议是减少并行化的内核数量。

我自己有 8 个内核和 32 GB 可用内存,我尝试使用 7 个内核,然后自己使用 6 个内核,但遇到了类似的错误。之后我决定只使用 4 个内核,它消耗了大约 70% 的内存:-

enter image description here

再多 1 个内核就可以了。

P.S:不要在意图片质量。