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

时间:2012-01-11 03:20:50

标签: r memory-management garbage-collection

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

这两个功能有什么区别? gc()是否针对某些变量调用rm()

3 个答案:

答案 0 :(得分:71)

首先,请务必注意两者的不同之处在于gc不会删除您仍在使用的任何变量 - 它只释放内存您无法再访问(无论是使用rm()删除,还是在已返回的函数中创建)。运行gc()永远不会让您丢失变量。

在调用gc()之后是否应该致电rm()的问题是一个很好的问题。 gc的documentation有用地说明:

  

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

     

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

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

答案 1 :(得分:0)

我个人喜欢在循环中包含gc()以在循环开始填充可用空间时释放一些RAM。像

这样的东西
for(i in 1:1000){
res[[i]] = some operation
gc()
}

答案 2 :(得分:0)

关于thankGoat对gc惩罚的评论,虽然这是事实,但人们当然可以决定在循环中每N次迭代调用gc(其中N可以通过多种方式进行参数化)。对于迭代次数较大但给定迭代中资源使用较为适度的循环,可能完全不必为了获得所需性能而每次迭代都进行GC。

当然,如果您要循环使用大量非常高的使用率迭代,这是一个不同的故事,但是在那个阶段,很可能只需要对向量进行矢量化和/或什至编写代码用另一种语言。