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