我时常在编程时草率行事,这会导致内存错误的出现。为了解决这个问题,我开始通过使用rm()
命令删除对象来进行一些纪律性的训练,并且情况得到了改善。然而,在网上,有关于是否应该在删除大数据对象后显式调用gc()
的混乱信息。有些人说在R返回内存错误之前它会自动运行gc()
,而另一些人则认为手动强制调用gc()
是个好主意。
我需要在删除大数据对象后调用gc()
以确保最大化的内存可用性吗?
我时常在编程时草率行事,这会导致内存错误的出现。为了解决这个问题,我开始通过使用rm()
命令删除对象来进行一些纪律性的训练,并且情况得到了改善。然而,在网上,有关于是否应该在删除大数据对象后显式调用gc()
的混乱信息。有些人说在R返回内存错误之前它会自动运行gc()
,而另一些人则认为手动强制调用gc()
是个好主意。
我需要在删除大数据对象后调用gc()
以确保最大化的内存可用性吗?
"可能吧。" 我也这样做,甚至经常在循环中这样做,就像
cleanMem <- function(n=10) { for (i in 1:n) gc() }
但在我的经验中,这并不能将内存恢复到原始状态。
所以我通常会将需要处理的任务保存在脚本文件中,并使用“r”前端(在Unix上,或者使用“littler”包)执行这些脚本。在另一个操作系统上,可以使用Rscript作为替代品。
这种工作流程与以下相关:
我们之前在这里讨论过。
从gc
帮助页面得知:
调用 'gc' 会导致进行垃圾回收。 这将在没有用户干预的情况下自动进行, 调用 'gc' 的主要目的是报告内存使用情况。
但是,当大型对象被移除后, 调用 'gc' 可能是有用的,因为这可能会提示R将内存释放给操作系统。
所以做这个操作有时候是有用的,但大多数情况下不需要这样做。我的个人观点是,这是最后的手段 - 你不应该在代码中随处添加gc()
语句,但如果你的计算机一直崩溃,并且你尝试了其他所有方法,那么它可能是有帮助的。
在尝试过其他一切之后,我指的是像以下这些方法:
编写函数而不是原始脚本,让变量超出范围。
如果您从一个与另一个无关的问题转移,请清空工作区。
丢弃您不感兴趣的数据/变量。(我经常收到带有数十个无趣列的电子表格。)
有点晚,但还是想说:
显式调用gc
会立即释放一些内存。……如果其他进程需要这些内存,这可能是一个好主意。例如,在调用system
或类似函数之前。或者在脚本完成并且 R 将闲置一段时间直到下一个任务到达时,这样其他进程可以获得更多内存。
如果你只是想让你的脚本运行得更快,那么这并不重要,因为如果R需要它,它后面会自动调用。这甚至可能会更慢,因为正常的GC循环可能从未需要调用它。
……但如果你想测量时间,通常在运行测试之前进行GC是个好主意。这也是system.time
默认执行的操作。
更新 正如@DWin所指出的,R(或C#、Java等)并不总是知道内存何时低于阈值需要运行GC。因此,有时候需要执行GC以解决内存系统中的缺陷。
据说R只使用RAM,但这在Mac上并不是真的(我怀疑Windows也是如此)。当RAM用尽时,它将开始使用虚拟内存。有时候,但并不总是,进程会“意识到”他们需要运行gc()并释放内存。如果他们没有这么做,你可以通过使用ActivityMonitor.app看到所有RAM都被占用且磁盘访问量已经增加。我发现,在进行大型Cox回归运算时,通过在调用之前使用gc(); cph(...)
,可以避免溢出到虚拟内存(慢速磁盘访问)。
不需要。如果操作所需的内存不足,R会自动运行gc()
。
gc()
可以帮助其他进程再次使用RAM,使计算机比调用gc()
之前更加响应。 - hugovdberg
gc()
有帮助呢? - samhiggins2001gc()
? - Chetan Arvind PatilRscript
的平台?我认为这是在任何操作系统上的替代选择,而不仅仅是“那个”平台。 - r2evans