这是我的代码。循环中的东西是有道理的。
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
答案 0 :(得分:10)
主进程调用函数serialize
和unserialize
,以便在使用套接字集群时与工作进行通信。如果从这些函数中的任何一个中获得错误,通常意味着至少有一个工作者已经死亡。在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)