我使用对 rm(list=ls())
的调用定期清理 R 中的内存。
之后我需要调用垃圾收集器 gc()
吗?
这两个功能有什么区别? gc()
是否为某些变量调用 rm()
?
首先,重要的是要注意这两者非常不同,因为 gc
不会删除您仍在使用的 任何 变量 - 它只会为您不再有权访问的变量释放内存to(无论是使用 rm()
删除,还是说,在一个已经返回的函数中创建)。运行 gc()
永远不会让您丢失变量。
不过,在调用 rm()
之后是否应该调用 gc()
的问题是一个很好的问题。 gc 的 documentation 有用地指出:
调用 gc 会导致垃圾收集发生。这也将自动发生,无需用户干预,调用 gc 的主要目的是报告内存使用情况。但是,在删除大对象后调用 gc 会很有用,因为这可能会提示 R 将内存返回给操作系统。
所以答案是调用 gc()
可能会很好(至少不会造成伤害),即使它可能无论如何都会被触发(如果不是马上,那么很快)。
我个人喜欢在循环中包含 gc()
以在循环开始填满可用空间时释放一些 RAM。就像是
for(i in 1:1000){
res[[i]] = some operation
gc()
}
ReThankGoat 对 gc 惩罚的评论,虽然这是真的,但当然可以决定在循环中每 N 次迭代调用 gc(其中 N 可以通过多种方式进行参数化)。对于迭代次数很大但给定迭代内的资源使用量较小的循环,可能没有必要在每次迭代中都进行 GC 以重新获得所需的性能。
当然,如果您正在循环使用大量非常高使用率的迭代,那就另当别论了,但在那个阶段,很可能只需要对代码进行矢量化和/或什至用另一种语言编写.
gc()
可以避免这种情况。使用可用内存是可以的,不必要的交换确实不行,因为它会对操作系统的可用性产生负面影响。最先进的 GC 可以更好地处理这个问题。gc()
。