【发布时间】:2015-11-01 15:40:49
【问题描述】:
我正在从事一项通过循环重复使用临时哈希表的工作。哈希表由 R 中的环境变量表示。问题是,随着循环的进行,无论我使用什么方法删除表,内存成本都会不断上升(我尝试了 rm() 和 gc(),但两者都无法释放内存。)因此,我无法完成一个非常长的循环,比如 10M 循环。它看起来像内存泄漏问题,但我无法在其他地方找到解决方案。我想问一下完全删除环境变量并同时释放它以前占用的所有内存的正确方法是什么。提前感谢您帮我检查问题。
这是一个非常简单的例子。我使用的是 Windows 8 和 R 版本 3.1.0。
> fun = function(){
H = new.env()
for(i in rnorm(100000)){
H[[as.character(i)]] = rnorm(100)
}
rm(list=names(H), envir=H, inherits=FALSE)
rm(H)
gc()
}
>
> for(k in 1:5){
print(k)
fun()
gc()
print(memory.size(F))
}
[1] 1
[1] 40.43
[1] 2
[1] 65.34
[1] 3
[1] 82.56
[1] 4
[1] 100.22
[1] 5
[1] 120.36
【问题讨论】:
-
看来 memory.size() 是 Windows 特定的。用 object.size() 将它移植到我的 OS X 机器上,我得到以下信息,它没有显示您看到的增长: > for (k in 1:5){ + print(k) + fun() + gc(0 ) + gc() + print(object.size(F)) + } [1] 1 48 字节 [1] 2 48 字节 [1] 3 48 字节 [1] 4 48 字节 [1] 5 48 字节
-
感谢您的回复。我想知道 Mac 中是否有 memory.size() 的替代函数可以显示当前的内存使用情况。我认为 object.size() 返回特定对象的内存成本,而不是整个工作空间的内存成本。所以object.size(F)表示布尔值'FALSE'占用的内存。
-
memory.size()给出总内存使用量。object.size()为特定对象提供内存。您应该能够通过rm(...); gc()实现您的目标——即您需要首先 删除对象,然后然后 运行垃圾回收。如需更多帮助,请参考lineprof