【问题标题】:R occupying virtual Memory completelyR完全占用虚拟内存
【发布时间】:2020-07-09 23:16:14
【问题描述】:

我多次重写我的程序以不达到任何内存限制。它再次占用了完整的 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 是如何设法连续吃掉我的内存的,即使我已经重写了将生成的对象存储在磁盘上的软件?

【问题讨论】:

  • 如何将它存储在磁盘上抢占内存?

标签: r memory memory-management rparallel


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我现在尝试通过在每个函数末尾打印sapply(ls(), function(x){ print("Sec Loop") print( object.size(get(x)) ) }) 来分析内存使用情况,以查找内存中增长的对象。然后最有可能使用您的方法进行清理。如果我解决了,我会及时通知你。
  • 您是否混淆了变量文件
  • 对不起,你是什么意思?我看到问题如下:1.我从磁盘加载一个对象到内存2.我处理对象并通过采样创建一个新对象3.我直接将这个对象保存到磁盘4.我通过采样创建一个新对象等等on... 在 x 个采样步骤之后,它从磁盘加载一个新对象并对该对象采样 x 次并将采样的对象写入磁盘,因此,在我看来,某个对象在内存中增长。而且我不知道是哪一个。
  • 每次读取后,下一次迭代前rm()最后一个文件和gc()
  • 好的,谢谢,我现在就试试你的方法。因为我的内存分析没有产生任何结果。我通过 ls() 跟踪的所有对象都很好。它们都没有变大。
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 2011-04-29
  • 2018-07-09
  • 2013-06-13
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多