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

使用gc()命令强制垃圾收集在R中运行,r,garbage-collection,R,Garbage Collection,我经常草率地编写程序。好吧,我一直都在草率地编写程序,但有时会出现内存不足的错误。我开始练习使用rm()命令删除对象的一些技巧,事情会变得更好。我在网上看到了关于删除大型数据对象后是否应显式调用gc()的混合消息。有人说,在R返回内存错误之前,它将运行gc(),而其他人则说手动强制执行gc是个好主意 删除大型对象后是否应该运行gc(),以确保最大的内存可用性?“可能。”我也会这样做,甚至经常像在 cleanMem <- function(n=10) { for (i in 1:n) gc(

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

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

“可能。”我也会这样做,甚至经常像在

cleanMem <- function(n=10) { for (i in 1:n) gc() }
cleanMem“也许吧。”我没有确切的答案。但是帮助文件表明调用gc()实际上只有两个原因:

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

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

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

    从帮助页面:

    调用“gc”会导致垃圾 将要进行的收集。这将 也会自动进行,无需 用户干预,以及主要 调用“gc”的目的是为了 报告内存使用情况

    但是,调用“gc”可能很有用 当一个大物体被移走后, 因为这可能会提示R返回内存 到操作系统

    这样做可能很有用,但大多数情况下你不应该这样做。我个人的观点是,这是最后的选择——你当然不应该把你的代码和
    gc()
    语句混在一起,但是如果你的机器不断地掉下来,而你已经尝试了所有其他方法,那么这可能会有帮助

    我指的是其他事情,比如

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

  • 如果您从一个问题转到另一个不相关的问题,则清空您的工作区

  • 丢弃您不感兴趣的数据/变量。(我经常收到电子表格,其中有几十个无趣的栏目。)


  • 派对有点晚了,但是:

    显式调用
    gc
    将“立即”释放一些内存。。。因此,如果其他进程需要内存,这可能是一个好主意。例如,在调用
    系统
    或类似程序之前。或者,当您“完成”脚本时,R将闲置一段时间,直到下一个作业到达——再次,以便其他进程获得更多内存

    如果您只是想让脚本运行得更快,那也没关系,因为如果需要,R稍后会调用它。它甚至可能更慢,因为正常的GC循环可能永远不需要调用它

    …但如果您想测量时间,例如,在运行测试之前执行GC通常是一个好主意。默认情况下,
    system.time
    就是这样做的


    UPDATE正如@DWin指出的,R(或C#或Java等)并不总是知道何时内存不足,GC需要运行。因此,您有时可能需要使用GC来解决内存系统中的不足。

    假定R只使用RAM。这在Mac电脑上是不正确的(我怀疑在Windows上也是不正确的。)如果内存耗尽,它将开始使用虚拟内存。有时,但并非总是,进程会“认识到”它们需要运行gc()并释放内存。当他们不这样做时,您可以通过使用ActivityMonitor.app看到所有RAM都已被占用,磁盘访问量也随之增加。我发现,当我进行大型Cox回归运行时,我可以通过调用
    gc()避免溢出到虚拟内存中(磁盘访问速度较慢);根据我的经验,cph(…)

    并非总是自动发生的。如果您经常使用大数据,请定期使用gc()或重新启动您的R会话。请为您的声明提供证据。>V1 sapply(1:20,函数(x){V2 warnings()警告消息:1:In vector(length=5.2e+07):达到1023Mb的总分配:请参阅帮助(memory.size)…32次>V1 sapply(1:20,函数(x){V2这是一个固定内存的场景。如果您使用rm()和gc(),您就可以了。您可以增加内存限制以避免此问题,但是在有非常好的RAM的情况下使用R-eating-swap真的很烦人。R“知道”吗其他进程的内存页必须交换,以便为R提供必要的空间?因为根据我的经验,有时在中间步骤之后调用
    gc()
    会有帮助,以允许其他进程再次使用RAM,使计算机比调用
    gc()
    之前响应更快。为什么运行
    gc()会有帮助
    重复?@DirkEddelbuettel-为什么要重复运行
    gc()
    ?是否有R支持的平台默认情况下不随
    Rscript
    一起提供?我认为这是任何操作系统上的一种替代方案,而不仅仅是“那个”一个。
    Rscript
    无处不在,littler和它的
    r
    不是。这是我喜欢后者的上下文(但前者刚刚修复了一个重要的boo boo)。在我的计算机中,gc()释放了一些内存,但并不完美。如果我加载了一个大对象,请删除它并使用gc()而且我没有得到与开始时相同的可用内存。我做的事情越多,无法恢复的内存就越多。最后,在对大对象进行多次操作后,我可能会耗尽内存。我在Windows 10 x64中,使用16GB的RAM。我可以确认R在Windows上不使用页面文件,有时它会非常有用。