使用mclapply时的内存分配错误

时间:2013-02-18 13:01:47

标签: r parallel-processing

这是我第一次使用mclapply在多个进程上运行并行脚本,但问题是我在我的笔记本电脑上尝试过这个脚本而且效果很好并且正确地填充了dataframe,但现在当我运行时我的office pc上的脚本,当打印结束并且是时候收集数据时,脚本会因此错误而停止:

Error: cannot allocate vector of size 80 Kb
    fun <- function(testdf) {
  l=12000
    errordf=data.frame()
    errordf <- mclapply(1:nrow(15000), function(i)
    {
    for (ind in 1:nrow(testdf)) 
       {
        if( i >= l/2 ){
            testdf[ind,]$X =  testdf[ind,]$pos * 2
        } else 
        {
            testdf[ind,]$X = testdf[ind,]$pos/l
        }
    }

    permdf <- testdf
   lapply(1:100, function(j)
    {   permdf$X<- sample(permdf$X,nrow(permdf), replace=FALSE)
            fit=lm(X ~ gx, permdf)   #linear regression calculation
             regerror=sum(residuals(fit)^2)

        data.frame(pc=i,error=regerror )
     })

}, mc.cores=3)
res<-NULL
tmp <- lapply(errordf, function(ii){
    tmp <- lapply(ii, function(ij){    #rbind the data and return the dataframe
        res<<- rbind(res, ij)
    })
})
return (res)
    }

testdf示例:

structure(list(ax = c(-0.0242214, 0.19770304, 0.01587302, -0.0374415, 
0.05079826, 0.12209738), gx = c(-0.3913043, -0.0242214, -0.4259067, 
-0.725, -0.0374415, 0.01587302), pos = c(11222, 13564, 16532, 
12543, 12534, 14354)), .Names = c("ax", "gx", "pos"), row.names = c(NA, 
-6L), class = "data.frame")

我确信代码正常工作(这就是为什么我没有包含完整的代码),因为我在笔记本电脑上多次尝试,但是当我在我的办公室电脑上尝试它时,它会在午餐时出错。

任何帮助都会受到赞赏

1 个答案:

答案 0 :(得分:0)

现在你不使用上一个双嵌套lapply循环中的apply,你也可以使用for循环而不是使用lapply结合全局变量。此外,你不断增长res,这相当于记忆和时间密集。通常情况下,lapply循环不会遇到此问题,但使用全局变量完全否定了优势。您似乎有rbind的双嵌套列表。我绝对不会在数据结构上循环,我只会使用do.call("rbind", data_structure)这样的内容来做这件事,尽管没有可重复的例子很难提供具体的建议。此解决方案不会遇到您遇到的持续增长问题。