我定期通过拨打rm(list=ls())
来清理R中的内存
之后我需要调用垃圾收集器gc()
吗?
这两个功能有什么区别? gc()
是否针对某些变量调用rm()
?
答案 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。
当然,如果您要循环使用大量非常高的使用率迭代,这是一个不同的故事,但是在那个阶段,很可能只需要对向量进行矢量化和/或什至编写代码用另一种语言。