我定期编程。好吧,我一直在编程,但有时会以内存错误的形式赶上我。我开始在使用rm()
命令删除对象时执行一些规则,事情会变得更好。我在网上看到有关在删除大型数据对象后是否应该显式调用gc()
的混合消息。有人说在R返回内存错误之前它会运行gc()
,而其他人则说手动强制gc
是个好主意。
我应该在删除大对象后运行gc()
以确保最大内存可用性吗?
答案 0 :(得分:43)
“大概”。我也这样做,甚至经常在
中循环cleanMem <- function(n=10) { for (i in 1:n) gc() }
然而,根据我的经验,这并没有将记忆恢复到原始状态。
所以我通常做的是将任务保存在脚本文件中,并使用'r'前端(在Unix上,从'littler'包中)执行。 Rscript是其他操作系统的替代品。
该工作流程恰好符合
我们之前介绍过。
答案 1 :(得分:22)
在gc
上的帮助页面:
调用'gc'会导致垃圾 收集发生。这将 也可以自动发生 用户干预和主要 调用'gc'的目的是为了 报告内存使用情况。
然而,调用'gc'会很有用 删除一个大型物体后 因为这可能会提示R返回内存 到操作系统。
所以它可以有用,但大多数情况下你不应该这样做。我个人的意见是,这是最后的代码 - 你不应该用gc()
语句乱丢你的代码,但如果你的机器不断摔倒,你已经尝试了其他一切,那么它可能会有所帮助。
除此之外,我的意思是
编写函数而不是原始脚本,因此变量超出范围。
如果您从一个问题转到另一个问题,请清空您的工作区。
丢弃您不感兴趣的数据/变量。(我经常收到包含数十个不感兴趣的专栏的电子表格。)
答案 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()只有两个理由:
由于它可以通过重复调用来减慢大型模拟,因此我倾向于仅在删除大型内容后才执行此操作。换句话说,除非你有充分的理由,否则我认为系统地一直称它是有道理的。