【问题标题】:remove a temporary environment variable and release memory in R删除临时环境变量并释放 R 中的内存
【发布时间】: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

标签: r memory


【解决方案1】:

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

【讨论】:

  • 谢谢。这很有道理。您对如何在 R 中实现哈希表或如何使符号可垃圾收集有任何建议吗?我通读了 R 包 'hash' 的手册,它也基于环境对象。谢谢。
  • 使符号可被垃圾回收必须在内部发生,因此要到明年的下一个 x.y.0 版本才能使用。不保证它会进入下一个版本,但它可能会。有人可以编写一个包来提供更丰富的哈希表数据类型,但至少现在必须使用环境以外的其他技术。
  • 3 年后,这方面有更新吗?似乎gctorture 能够做到这一点,但速度非常慢。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2021-07-14
  • 2019-10-12
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多