gpt4 book ai didi

r - 在 R 中跟踪内存使用和垃圾收集

转载 作者:IT王子 更新时间:2023-10-28 23:34:13 27 4
gpt4 key购买 nike

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

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

2) 更深入地嵌套对函数的调用而不是分配中间变量是否有任何意义?这会减少内存使用吗?

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

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

乔什

最佳答案

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

2) 在类似的函数中

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

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

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

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 位平台。

关于r - 在 R 中跟踪内存使用和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com