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

时间:2009-09-23 16:37:14

标签: r garbage-collection

我定期编程。好吧,我一直在编程,但有时会以内存错误的形式赶上我。我开始在使用rm()命令删除对象时执行一些规则,事情会变得更好。我在网上看到有关在删除大型数据对象后是否应该显式调用gc()的混合消息。有人说在R返回内存错误之前它会运行gc(),而其他人则说手动强制gc是个好主意。

我应该在删除大对象后运行gc()以确保最大内存可用性吗?

6 个答案:

答案 0 :(得分:43)

“大概”。我也这样做,甚至经常在

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

然而,根据我的经验,这并没有将记忆恢复到原始状态。

所以我通常做的是将任务保存在脚本文件中,并使用'r'前端(在Unix上,从'littler'包中)执行。 Rscript是其他操作系统的替代品。

该工作流程恰好符合

我们之前介绍过。

答案 1 :(得分:22)

gc上的帮助页面:

  

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

     

然而,调用'gc'会很有用   删除一个大型物体后   因为这可能会提示R返回内存   到操作系统。

所以它可以有用,但大多数情况下你不应该这样做。我个人的意见是,这是最后的代码 - 你不应该用gc()语句乱丢你的代码,但如果你的机器不断摔倒,你已经尝试了其他一切,那么它可能会有所帮助。

除此之外,我的意思是

  1. 编写函数而不是原始脚本,因此变量超出范围。

  2. 如果您从一个问题转到另一个问题,请清空您的工作区。

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

答案 2 :(得分:13)

派对有点晚了,但是:

明确调用gc将“现在”释放一些内存。 ...所以如果其他进程需要内存,那可能是个好主意。例如在调用system之前或类似之前。或者也许当你“完成”脚本并且R将闲置一段时间直到下一个作业到来 - 再次,以便其他进程获得更多内存。

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

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

UPDATE 正如@DWin所指出的,R(或C#或Java等)并不总是知道内存何时低并且GC需要运行。因此,有时您可能需要将GC作为解决内存系统缺陷的方法。

答案 3 :(得分:13)

据说R只使用RAM。这在Mac上是不正确的(我怀疑在Windows上也不是这样。)如果RAM耗尽,它将开始使用虚拟内存。有时,但并非总是如此,进程将“识别”他们需要运行gc()并释放内存。当他们不这样做时,您可以通过使用ActivityMonitor.app看到这一点,并看到所有RAM都被占用并且磁盘访问量已经上升。我发现当我进行大型Cox回归运行时,我可以通过先前使用gc(); cph(...)

的调用来避免溢出到虚拟内存中(使用慢速磁盘访问)

答案 4 :(得分:8)

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

答案 5 :(得分:7)

“也许”。我真的没有明确的答案。但帮助文件表明,调用gc()只有两个理由:

  1. 您需要一份内存使用情况报告。
  2. 删除大对象后,“它可能会提示R将内存返回给操作系统。”
  3. 由于它可以通过重复调用来减慢大型模拟,因此我倾向于仅在删除大型内容后才执行此操作。换句话说,除非你有充分的理由,否则我认为系统地一直称它是有道理的。