【问题标题】:Error in serialize(data, node$con) : error writing to connection序列化错误(数据,node$con):写入连接时出错
【发布时间】:2018-06-27 04:10:19
【问题描述】:

我目前正在尝试运行一些实现并行处理的代码,但我遇到了这个错误:

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)

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

    foreach 所做的并行化是空间与时间的权衡。我们以更高的内存使用为代价获得更快的执行。内存使用率较高的原因是启动了多个 R 进程,每个进程都需要自己的内存来保存计算所需的数据。目前foreach 正在使用隐式PSOCK 集群。解决此问题的一种方法是使用较少数量的进程显式创建集群。多低取决于您拥有的内存量以及每个作业的内存需求:

    n <- parallel::detectCores()/2 # experiment!
    cl <- parallel::makeCluster(n)
    doParallel::registerDoParallel(cl)
    <foreach>
    parallel::stopCluster(cl)
    

    【讨论】:

    • 谢谢!我对此还有一个额外的澄清问题:更改内核数量似乎消除了前两个错误(内存分配和序列化一个),但最后一个错误(我已将其复制到最后)仍然存在。这也是与核心数量有关的内存分配问题吗? `反序列化错误(node$con):从连接读取错误调用: ... doTryCatch -> recvData -> recvData.SOCKnode -> unserializ e`
    • 奇怪的是,当我设置 n ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize 执行暂停
    • @ingridm 在这种情况下,我需要minimal reproducible example 来进一步分析。
    • 您甚至可以使用n &lt;- 1 进行故障排除,以进一步降低内存使用量。
    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-02-15
    • 2015-08-11
    • 2019-12-31
    • 2018-01-15
    • 2014-10-05
    相关资源
    最近更新 更多