【问题标题】:tracking memory usage and garbage collection in R在 R 中跟踪内存使用和垃圾收集
【发布时间】:2011-09-12 19:23:34
【问题描述】:

根据 Windows 任务管理器的报告,我正在运行深度嵌套并消耗大量内存的函数。输出变量相对较小(比消耗的内存量小 1-2 个数量级),因此我假设差异可归因于函数中某处分配的中间变量(或在被调用的子函数中)和垃圾收集的延迟。所以,我的问题是:

1) 我的假设正确吗?为什么或者为什么不?

2) 简单地将函数调用嵌套得更深而不是分配中间变量有什么意义吗?这会减少内存使用吗?

3) 假设 R 在具有 4GB RAM 的系统上使用 3GB 内存。运行 gc() 后,它现在只使用 2GB。在这种情况下,如果我调用另一个耗尽 1.5GB 内存的函数,R 是否足够聪明,可以自行运行垃圾收集?

我正在使用的某些数据集在处理它们时会因内存不足而导致系统崩溃,我正在尝试缓解这种情况。提前感谢您的任何回答!

乔什

【问题讨论】:

    标签: r memory garbage-collection


    【解决方案1】:

    R 具有内存分析功能,但需要构建它。虽然我们为 Debian / Ubuntu 启用了该功能,但我不知道 Windows 的默认设置是什么。

    “编写 R 扩展”手册中(简要)讨论了内存分析的使用。

    在 32 位系统(尤其是 Windows)上处理(有限)内存有其挑战。大多数人会建议您切换到运行 64 位操作系统的 RAM 尽可能多的系统。

    【讨论】:

      【解决方案2】:

      1) 用于表示 R 中的对象的内存和被操作系统标记为正在使用的内存被几个层分开(R 自己的内存处理,操作系统何时以及如何从应用程序中回收内存等)。我会说(a)我不确定,但是(b)有时任务管理器的内存使用概念可能无法准确反映 R 实际使用的内存,但是(c)是的,可能是您的差异describe 反映了 R 为当前会话中的对象分配的内存。

      2) 在类似的函数中

      f = function() { a = 1; g=function() a; g() }
      

      调用f() 打印1,暗示a 使用的内存在调用g 时仍被标记为正在使用。所以嵌套函数对内存管理没有帮助,可能反过来。

      您最好的选择是在进行更大的分配之前清理或重用表示大量分配的变量。适当设计的函数可以帮助解决这个问题,例如,

      f = function() { m = matrix(0, 10000, 10000); 1 }
      g = function() { m = matrix(0, 10000, 10000); 1 }
      h = function() { f(); g() }
      

      f 返回时不再需要f 的大内存,因此如果g 所需的大内存需要,则可用于垃圾回收。

      3) 如果 R 尝试为变量分配内存但不能,它将运行其垃圾收集器 a 并重试。因此,您自己运行 gc() 不会获得任何收益。

      我会确保您编写了内存效率高的代码,如果仍然存在问题,我会转移到内存问题较少的 64 位平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-15
        • 2013-10-10
        • 2017-10-30
        • 2023-04-05
        • 2021-04-30
        • 2010-09-25
        • 2021-07-30
        • 2012-11-30
        相关资源
        最近更新 更多