0

这是我第一次使用 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")

我确定代码可以正常工作(这就是我没有包含完整代码的原因),因为我在笔记本电脑上尝试了多次,但是当我在办公室电脑上尝试时,出现了这个错误。

任何帮助将不胜感激

4

1 回答 1

0

现在,您没有在最后一个双嵌套lapply循环中按预期使用 apply ,您不妨使用for循环而不是使用 lapply 与全局变量组合。此外,你不断成长res,这是相当内存和时间密集型的。通常,lapply循环不会遇到这个问题,但是您使用全局变量完全否定了这个优势。您似乎有一个想要的双重嵌套列表rbind。我肯定不会遍历数据结构,我只会使用类似的东西 do.call("rbind", data_structure)来做到这一点,尽管如果没有可重复的例子就很难提供具体的建议。此解决方案不会受到您遇到的不断增长的问题的影响。

于 2013-02-19T09:47:43.333 回答