我通过调用 rm(list=ls())
定期清理 R 中的内存。
这之后,我需要调用垃圾回收器 gc()
吗?
这两个函数有什么区别?gc()
是否会针对某些变量调用 rm()
?
我通过调用 rm(list=ls())
定期清理 R 中的内存。
这之后,我需要调用垃圾回收器 gc()
吗?
这两个函数有什么区别?gc()
是否会针对某些变量调用 rm()
?
首先,需要注意的是这两者非常不同。使用gc
时并不会删除你仍在使用的任何变量,它只释放那些你无法访问到的内存(无论是使用rm()
移除的还是在函数中创建后已经被返回)。运行gc()
永远不会使你丢失变量。
然而,在调用rm()
之后是否应该调用gc()
是一个很好的问题。gc的文档非常有帮助地指出:
调用gc将导致进行垃圾回收。这也会自动进行而无需用户干预,调用gc的主要目的是报告内存使用情况。
然而,在删除大型对象后调用gc可能会有所帮助,因为这可能会促使R将内存返回给操作系统。
因此,答案是可以调用gc()
(至少不会有坏处),即使它可能很快就会被触发(如果不是立即触发,那么很快也会触发)。
个人喜欢在循环中包含gc()
以释放一些RAM,当循环开始填充可用空间时。像这样:
for(i in 1:1000){
res[[i]] = some operation
gc()
}
gc()
可以避免这种情况。使用可用内存是可以的,但是不必要的交换会对操作系统的可用性产生负面影响。现代垃圾回收机制处理这个问题更好。 - Konrad Rudolphgc()
函数。 - Paulgc()
,等了一分钟,然后发现所有的内存都被重新分配给了我的会话,因此我又可以保存变量了。我想重申gc
文档中的内容:...在删除大对象后调用gc可能很有用...
- Mus