gc()和rm()有什么区别

Roc*_*nce 59 garbage-collection memory-management r

我定期用R调用来清理R中的内存rm(list=ls()).
之后我需要打电话给垃圾收集器gc()吗?

这两个功能有什么区别?是否gc()要求rm()某些变量?

Dav*_*son 77

首先,重要的是要注意两者是非常不同的,gc因为它们不会删除您仍在使用的任何变量 - 它只释放您不再有权访问的内存(无论是使用rm()或者,例如,创建的在一个已经返回的函数中).跑步gc()永远不会让你失去变数.

但是,你是否应该在打电话gc()后打电话rm()是一个很好的问题.gc 的文档有用地说明:

调用gc会导致垃圾收集.这也将在没有用户干预的情况下自动进行,调用gc的主要目的是报告内存使用情况.

但是,在删除大对象后调用gc会很有用,因为这可能会提示R将内存返回给操作系统.

所以答案是,调用gc()(并且至少不会受到伤害)是好的,即使它可能会被触发(如果不是马上,那么很快).

  • @hadley根本不符合我的经验.相反,即使在大型对象(〜几百MiB)不再可用之后,R也经常导致我的操作系统交换.但是,手动调用`gc()`可以避免这种情况.使用可用内存是可以的,不必要的交换实际上不是,因为它会对操作系统的可用性产生负面影响.最先进的GC可以更好地处理这个问题. (12认同)
  • 一般来说,你不应该打电话给gc,如果你这样做,它不太可能有很大的不同. (5认同)
  • 对于今天遇到这个问题并随后阅读这个答案的人,我刚刚从我的环境中删除了一些变量 - 这些变量占用了约 15GB 的内存 - 然而 R 仍然在努力存储任何进一步的变量,尽管已经删除了我不再使用的大变量需要。然后我运行“gc()”,等了一分钟,然后发现所有内存都已重新分配给我的会话,从而允许我再次保存变量。我想重申 `gc` 文档的说明:“...在删除大对象后调用 gc 会很有用...” (3认同)
  • 赞同@KonradRudolph的评论-在最近的一些工作中,我一直注意到函数的局部变量消耗了大量的内存。当变量超出范围时,不会释放内存,就像其他语言一样。我不得不叫`gc()`。 (2认同)