wol*_*oor 19 parallel-processing r
这是我的代码.循环中的东西是有道理的.
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)
}
Run Code Online (Sandbox Code Playgroud)
我一直收到这个错误:
Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)
我知道我有足够的核心(有20个).有人能帮忙吗?似乎答案无处可在文档中找到!
当我ps -ef| grep user在我的unix服务器上运行时,我得到:
/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
Run Code Online (Sandbox Code Playgroud)
Ste*_*ton 13
的功能serialize和unserialize由主处理称为使用套接字群集时与工人进行通信.如果从这些功能中的任何一个中获得错误,通常意味着至少有一名工人已经死亡.在Linux机器上,它可能已经死亡,因为机器几乎没有内存,因此内存不足的杀手决定杀死它,但还有许多其他可能性.
我建议您outfile=""在创建集群对象时使用makeCluster 选项,以便显示worker的输出.如果你很幸运,你会在工作人员死亡之前收到一条错误信息,以帮助你解决问题.
当我尝试使用机器的所有 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)
Run Code Online (Sandbox Code Playgroud)
您分配的每个核心都会消耗内存。因此,核心越多意味着需要更多内存,一旦用完内存,您就会收到此错误。所以我的建议是减少并行化的核心数量。
我自己有 8 个核心和 32 GB 可用内存,我自己尝试使用 7 个核心,然后是 6 个核心,但遇到了类似的错误。之后我决定只使用 4 个核心,因为它消耗了大约 70% 的内存:-
多 1 个核心可能就可以了。
PS: 不要介意画质。
我从下面收到了类似的错误,我提前终止了模型训练,然后尝试再次运行它。这是一个例子,我正在使用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
Run Code Online (Sandbox Code Playgroud)
我关闭了集群并重新启动它:
stopCluster(cluster)
registerDoSEQ()
cluster <- makeCluster(10)
registerDoParallel(cluster)
Run Code Online (Sandbox Code Playgroud)
再次运行模型时没有看到错误。有时将其关闭然后重新打开确实可能是解决方案。