使用 gc()命令强制在 R 中运行垃圾回收

我定期草率地编程。好吧,我一直都在草率地编程,但有时候这会导致我出现内存不足的错误。我开始练习用 rm()命令删除对象,然后事情就变得更好了。在删除大型数据对象之后,我在网上看到关于是否应该显式调用 gc()的混合消息。一些人说,在 R 返回一个内存错误之前,它将运行 gc(),而其他人说,手动强制 gc是一个好主意。

删除大型对象后是否应该运行 gc()以确保最大的内存可用性?

33265 次浏览

“可能吧。”我也这么做,而且经常是在一个循环里

cleanMem <- function(n=10) { for (i in 1:n) gc() }

然而,根据我的经验,这并不能使记忆恢复到原始状态。

因此,我通常做的是将手头的任务保存在脚本文件中,并使用‘ r’前端(在 Unix 上,从‘ little’包中)执行这些任务。Rscript 是另一个操作系统的替代品。

这个工作流恰好符合

我们之前已经讨论过了。

“也许吧”我还没有确切的答案。但是帮助文件表明,实际上只有两个原因需要调用 gc () :

  1. 您需要一个内存使用情况报告。
  2. 删除一个大对象后,“它可能会提示 R 将内存返回到操作系统。”

由于它可以通过重复调用减慢大型模拟的速度,所以我倾向于只在删除一些较大的内容之后才这样做。换句话说,除非你有充分的理由,否则我不认为一直系统地调用它是有意义的。

如果没有足够的内存可用于操作,R 将自动运行 gc()

来自 gc的帮助页面:

调用‘ gc’会导致垃圾 收集。这将 也会自动发生 用户干预和主要的 调用‘ gc’的目的是为了 内存使用情况报告。

不过,调用“ gc”可能会很有用 在一个大的物体被移走之后, 因为这可能会提示 R 返回内存 连接到操作系统。

因此,它 可以是有用的做,但大多数情况下,你不应该有。我个人的观点是,这是最后的手段——你不应该把 gc()语句当成一种理所当然的东西,但是如果你的机器总是出故障,而且你已经尝试了所有其他的方法,那么它可能会有所帮助。

其他的一切,我指的是

  1. 编写函数而不是原始脚本,因此变量超出了作用域。

  2. 如果您从一个问题转移到另一个不相关的问题,则清空您的工作空间。

  3. 丢弃您不感兴趣的数据/变量(我经常收到包含几十个无趣列的电子表格)

有点晚了,但是:

显式调用 gc将“现在”释放一些内存。所以如果 其他程序需要内存,这可能是个好主意。例如,在调用 system或类似的。或者,当您“完成”了脚本并且 R 将空闲一段时间,直到下一个作业到达——同样,这样 其他程序获得更多的内存。

如果您只是希望脚本运行得更快,那么这并不重要,因为如果需要,R 稍后会调用它。它甚至可能更慢,因为正常的 GC 循环可能永远不需要调用它。

但是如果你想测量时间,在运行你的测试之前做一个 GC 通常是一个好主意。这是 system.time默认所做的。

UPDATE 正如@DWin 指出的,R (或 C # ,或 Java 等)并不总是知道什么时候内存不足,需要运行 GC。因此,有时可能需要使用 GC 作为内存系统缺陷的解决方案。

假设 R 只使用 RAM。这在 Mac 上是不正确的(我怀疑在 Windows 上也是不正确的)如果它耗尽了 RAM,它将开始使用虚拟内存。有时(但并非总是如此) ,进程会“认识到”它们需要运行 gc ()并释放内存。当他们不这样做时,您可以通过使用 ActivityMonitor. app 看到这一点,并看到所有的 RAM 被占用,磁盘访问已经跳出。我发现,当我进行大型 Cox 回归运行时,我可以通过使用 gc(); cph(...)进行前面的调用来避免溢出到虚拟内存中(使用缓慢的磁盘访问)