使用gc()命令强制垃圾收集在R中运行
我定期地编程。 好的,我一直在不停地编程,但是有时候,这会以内存不足的错误的方式跟上我的脚步。 我开始用rm()命令删除对象,并且事情变得更好。 我在网上看到有关是否应在删除大型数据对象后显式调用gc()的混合消息。 有人说,在R返回内存错误之前,它会运行gc(),而另外一些人说手动强制gc是一个好主意。
我应该在删除大对象后运行gc()以确保最大的内存可用性?
“大概。” 我也这样做,甚至经常在一个循环中
cleanMem <- function(n=10) { for (i in 1:n) gc() }
但根据我的经验,这并不能使记忆恢复到原始状态。
所以我通常所做的就是将脚本文件保存在脚本文件中,并使用'r'前端(在Unix上以及“littler”包中)执行脚本文件。 Rscript是另一个操作系统的替代品。
这个工作stream恰好符合
- 工作stream换统计分析和报告写作
- 技巧pipe理的最可用的内存,在安-R-会议
我们之前在这里介绍过
从gc
上的帮助页面:
“gc”调用会导致垃圾回收。 这也将自动发生,无需用户干预,调用'gc'的主要目的是报告内存使用情况。
但是,在删除大对象后调用“gc”会很有用,因为这可能会提示R将内存返回给操作系统。
所以这样做可能很有用,但大多数情况下你不应该这么做。 我个人的观点是,这是最后的代码 – 你不应该用gc()
语句乱丢你的代码,但是如果你的机器一直在摔倒,而你尝试了其他所有的东西,有帮助。
其他的一切,我的意思是像
-
编写函数而不是原始脚本,所以variables超出范围。
-
清空你的工作空间,如果你从一个问题到另一个不相关的问题。
-
丢弃您不感兴趣的数据/variables(我经常收到带有数十个无趣列的电子表格。)
晚会有点迟,但是:
显式调用gc
将“释放”一些内存。 …所以如果其他进程需要内存,这可能是一个好主意。 例如在调用system
或类似的之前。 或者,当你用脚本“完成”时,R将闲置一段时间,直到下一个工作到达 – 再次,以便其他进程获得更多的内存。
如果你只是想让你的脚本运行得更快,那么就不会有问题,因为如果需要的话R会稍后调用它。 由于正常的GC周期可能永远不需要调用,所以它可能会更慢。
…但是如果你想测量时间,在运行testing之前先做一个GC是个好主意。 这是system.time
在默认情况下所做的。
更新 @DWin指出,R(或C#或Java等)并不总是知道什么时候内存不足,GC需要运行。 所以有时你需要做GC来解决内存系统的缺陷。
据说R只使用RAM。 这在Mac上是不正确的(我怀疑它在Windows上也不是这样)。如果内存不足,它将开始使用虚拟内存。 有时(但并非总是),进程将“识别”他们需要运行gc()并释放内存。 当他们不这样做时,你可以通过使用ActivityMonitor.app看到这一点,并看到所有的RAM被占用,磁盘访问已经跳起来。 我发现,当我正在做大的Cox回归运行时,我可以通过前面的调用gc(); cph(...)
来避免溢出到虚拟内存(通过慢速磁盘访问gc(); cph(...)
gc(); cph(...)
不行。如果没有足够的内存用于操作,R将自动运行gc()
。
“也许。” 我真的没有确切的答案。 但是帮助文件表明调用gc()只有两个原因:
- 你想要一个内存使用情况的报告。
- 删除大对象后,“可能会提示R将内存返回到操作系统”。
由于它可以通过重复的呼叫来减慢大的模拟,所以在去除大的东西之后,我倾向于只做它。 换句话说,除非你有充分的理由,否则我不认为有系统地称它是有意义的。