Ошибка в сериализации (данные, узел $ con): ошибка записи в соединение - PullRequest
0 голосов
/ 27 июня 2018

Я сейчас пытаюсь запустить некоторый код, который реализует параллельную обработку, но я сталкиваюсь с этой ошибкой:

Error: cannot allocate vector of size 2.1 Gb
Execution halted
Error in serialize(data, node$con) : error writing to connection
Calls: %dopar% ... postNode -> sendData -> sendData.SOCKnode -> serialize
Execution halted
Warning message:
system call failed: Cannot allocate memory 
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> 
unserialize Execution halted

Не могу понять, почему проблема с памятью. Если я возьму код из цикла foreach или заменим foreach на цикл for, он будет работать отлично, поэтому я не думаю, что это связано с содержимым самого кода, а скорее с распараллеливанием. Кроме того, кажется, что ошибка выдается довольно скоро после того, как код начинает выполняться. Есть идеи, почему это может происходить? Вот посмотрите на мой код:

list_storer <- list() 

list_storer <- foreach(bt=2:bootreps, .combine=list, .multicombine=TRUE) %dopar% {
ur <- sample.int(nrow(dailydatyr),nrow(dailydatyr),replace=TRUE)
ddyr_boot <- dailydatyr[ur,]
weightvar <- ddyr_boot[,c('ymd1_IssueD','MatD_ymd2')]
weightvar <- abs(weightvar)
x <- DM[ur,]
y<-log(ddyr_boot$dirtyprice2/ddyr_boot$dirtyprice1)
weightings <- rep(1,nrow(ddyr_boot))
weightings <- weightings/(ddyr_boot$datenum2-ddyr_boot$datenum1)

treg <- repeatsales(y,x,maxdailyreturn,weightings,weightvar)


zbtcol <- 0
cnst <- NULL


if (is.null(dums) == FALSE){
  zbtcol <- length(treg)-ncol(x)
  cnst <- paste("tbs(",dums,")_",(middleyr),sep="")
  if (is.null(interactVar) == FALSE){ 
    ninteract <- (length(treg)-ncol(x)-length(dums))/length(dums)
    interact <- unlist(lapply(cnst,function(xla) paste(xla,"*c",c(1:ninteract),sep="")))
    cnst <- c(cnst,interact)}
  }     
}       

tregtotal <- tregtotal + (is.na(treg)==FALSE)
treg[is.na(treg)==TRUE] <- 0

list_storer[[length(list_storer)+1]] <- treg

}

stopImplicitCluster(cl)

1 Ответ

0 голосов
/ 27 июня 2018

Распараллеливание, сделанное foreach, является компромиссом между пространством и временем. Мы получаем более быстрое выполнение за счет более высокого использования памяти. Причиной более высокого использования памяти является то, что запускается несколько процессов R, и каждому из них требуется собственная память для хранения данных, необходимых для расчета. В настоящее время foreach использует неявный кластер PSOCK. Одним из способов решения этой проблемы является явное создание кластера с использованием меньшего числа процессов. Как низко зависит от объема вашей памяти и требований к памяти для каждого задания:

n <- parallel::detectCores()/2 # experiment!
cl <- parallel::makeCluster(n)
doParallel::registerDoParallel(cl)
<foreach>
parallel::stopCluster(cl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...