基于R中内存使用的触发事件

时间:2011-10-04 14:45:12

标签: r

我想知道基于R中的内存使用情况来触发事件的好方法是什么。假设我将一堆文件合并到一个主文件中,但整个主文件的大小可能太大而无法保存在内存中。当我接近内存限制时,我想保存当前的主文件和空闲内存。

master <- NULL
partnum <- 1
threshold  <- 0.8
filelist <- list.files(mypath)

for (filename in filelist) 
{
   filedata <- read.csv(filename)
   if (is.null(master)) master <- filedata
   else master <- rbind(master,filedata)
   rm(filedata)

   # test for memory usage here
   # if (usedMemory > availableMemory * threshold)
   # then do the following else go to top of loop

   save(master,file=paste(mypath,partnum,"rData",sep="."))
   master <- NULL
   partnum <- partnum + 1
}

我想做的是能够计算机器上可用的内存量。这样,事件将根据当前的机器使用情况动态触发。假设脚本启动时机器上有10GB可用,因此在使用8GB时进行清理。但是说执行中期另一个用户启动了一个消耗5GB的程序,那么我想在使用4GB时进行清理。

> x <- 1:10^9
> memory.size()
[1] 3832.26
> memory.limit()
[1] 16381
> gc()
            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    164953    8.9     350000   18.7    350000   18.7
Vcells 500150216 3815.9  669246830 5106.0 550150069 4197.4

此时我的机器上只有10GB可用,因为其他进程消耗2GB

1 个答案:

答案 0 :(得分:2)

您可能想尝试memory.size。也许是这样的:

# Are we using more than 1 GB?
if (memory.size() > 1000) {
  # Force a garbage collect and check again
  gc()
  if (memory.size() > 1000) {
    # free up memory...
  }
}

memory.size的调用不会进行垃圾收集,因此您可以在调用之前或在有条件的情况下执行此操作(如上例所示)(垃圾收集可能需要一些时间)。