我想知道基于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
答案 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
的调用不会进行垃圾收集,因此您可以在调用之前或在有条件的情况下执行此操作(如上例所示)(垃圾收集可能需要一些时间)。