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

删除临时环境变量并释放R中的内存,r,memory,R,Memory,我正在从事一项工作,其中通过循环重复使用临时哈希表。哈希表由R中的一个环境变量表示。问题是,随着循环的进行,无论我使用何种方法删除该表,内存成本都会不断增加(我尝试了rm()和gc(),但两者都无法释放内存)。因此,我无法完成非常长的循环,比如说10万圈。这看起来像是内存泄漏问题,但我在别处找不到解决方案。我想问一下,完全删除环境变量并同时释放它以前占用的所有内存的正确方法是什么。提前谢谢你帮我检查这个问题 这是一个非常简单的例子。我使用的是Windows 8和R版本3.1.0 > fun

我正在从事一项工作,其中通过循环重复使用临时哈希表。哈希表由R中的一个环境变量表示。问题是,随着循环的进行,无论我使用何种方法删除该表,内存成本都会不断增加(我尝试了
rm()
gc()
,但两者都无法释放内存)。因此,我无法完成非常长的循环,比如说10万圈。这看起来像是内存泄漏问题,但我在别处找不到解决方案。我想问一下,完全删除环境变量并同时释放它以前占用的所有内存的正确方法是什么。提前谢谢你帮我检查这个问题

这是一个非常简单的例子。我使用的是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

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

看来memory.size()是特定于Windows的。将它与object.size()一起移植到我的OSX盒中,我得到了以下结果,但这并没有显示您看到的增长:>for(k in 1:5){+print(k)+fun()+gc(0)+gc()+print(object.size(F))+}[1]148字节[1]248字节[1]348字节[1]448字节[1]548字节[1]548字节[1]48bytesthanks谢谢您的回复。我想知道Mac中是否有一个替代memory.size()的函数可以显示当前的内存使用情况。在我看来,object.size()返回特定对象的内存开销,而不是整个工作空间的内存开销。因此object.size(F)表示布尔值'FALSE'占用的内存。
memory.size()
给出了总内存使用量
object.size()
提供特定对象的内存。您应该能够通过
rm(…)实现您的目标;gc()
——也就是说,您需要首先删除对象,然后运行垃圾收集。如果您需要更多帮助,请参阅“谢谢”。这很有道理。对于如何在R中实现哈希表,或者如何使符号可以被垃圾回收,您有什么建议吗?我通读了R包“hash”的手册,它也基于环境对象。谢谢。使符号垃圾回收必须在内部进行,因此在明年的下一个x.y.0版本之前无法使用。没有承诺它将进入下一个版本,但它可能。有人可以编写一个包来提供更丰富的哈希表数据类型,但至少目前必须使用环境以外的其他技术。3年后,这方面是否有更新?似乎
gc
能够做到这一点,但速度非常慢。