删除临时环境变量并释放R中的内存

时间:2015-08-09 18:25:20

标签: r memory

我正在从事一项工作,其中通过循环重复使用临时哈希表。哈希表由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

1 个答案:

答案 0 :(得分:6)

对于在计算过程中密钥变化很大的情况,R中的环境不是一个好的选择。原因是环境要求键是符号,而符号不是垃圾收集的。因此,每次运行函数都会添加到内部符号表中。安排符号被垃圾收集是一种可能性,但是需要小心,因为许多内部代码假定它们不是。另一种选择是创建更好的哈希表支持,这样环境就不必尝试为此目的而设计它们。