DoParallel error in R: Ошибка в сериализации (данные, node $con): запись ошибок в соединение

Это мой код. Материал внутри цикла имеет смысл.

        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). Может кто-нибудь помочь с этим? Кажется, что ответ не найден в документах!

Когда я запускаю 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

Ответ 1

Функции serialize и unserialize вызываются мастер-процессом для связи с рабочими при использовании кластера сокетов. Если вы получаете ошибку от любой из этих функций, это обычно означает, что по крайней мере один из рабочих умер. На машине Linux она, возможно, умерла, потому что машина была почти не в памяти, поэтому убийца без памяти решил убить его, но есть много других возможностей.

Я предлагаю вам использовать параметр makeCluster outfile="" при создании объекта кластера, чтобы отображался вывод рабочих. Если вам повезет, вы получите сообщение об ошибке от работника, прежде чем он умрет, что поможет вам решить проблему.

Ответ 2

У меня была такая же проблема, когда я пытался использовать все 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)