0

我多次重写我的程序以不达到任何内存限制。它再次占用了完整的 VIRT,这对我来说没有任何意义。我不保存任何对象。每次完成计算后,我都会写入磁盘。

代码(简化)看起来像


 lapply(foNames, # these are just folder names like ["~/datastes/xyz","~/datastes/xyy"]
        function(foName){
     Filepath <- paste(foName,"somefile,rds",sep="")
     CleanDataObject <- readRDS(Filepath) # reads the data

     cl <- makeCluster(CONF$CORES2USE) # spins up a cluster (it does not matter if I use the cluster or not. The problem is intependent imho)

     mclapply(c(1:noOfDataSets2Generate),function(x,CleanDataObject){
                                            bootstrapper(CleanDataObject)
                                         },CleanDataObject)
     stopCluster(cl)
 })

bootstrap 函数只是对数据进行采样并将采样的数据保存到磁盘。

bootstrapper <- function(CleanDataObject){

   newCPADataObject <- sample(CleanDataObject)
   newCPADataObject$sha1 <- digest::sha1(newCPADataObject, algo="sha1")

   saveRDS(newCPADataObject, paste(newCPADataObject$sha1 ,".rds", sep = "") )

   return(newCPADataObject)
}

我不明白它现在如何累积到超过 60 GB 的 RAM。代码被高度简化,但恕我直言,没有其他可能有问题的地方。如果需要,我可以粘贴更多代码详细信息。

R即使我已经重写了将生成的对象存储在磁盘上的软件,如何设法连续吃掉我的内存?

4

1 回答 1

0

我过去曾遇到过循环问题。在功能上寻址和应用都比较复杂。

但是,我所做的是结合使用两件事来解决问题。

在每个生成临时文件rm(file-name)的函数中,使用 删除临时文件,然后运行gc()它在退出函数之前强制进行垃圾收集。这会减慢一些过程,但会减少内存压力。这样,apply 的每次迭代都会在继续下一步之前清除。您可能必须返回嵌套函数中的第一个函数才能很好地完成此任务。需要进行实验才能确定系统的备份位置。

如果您使用从通过 rJava 构建的包调用的任何方法,我发现这尤其必要,这非常浪费资源,并且 R 无法在 Java 堆上运行垃圾收集,而且大多数 Java 包的作者似乎都没有考虑到需要在他们的方法中收集。

于 2020-03-29T15:18:11.440 回答