gc() 和 rm() 有啥区别
Posted
技术标签:
【中文标题】gc() 和 rm() 有啥区别【英文标题】:What is the difference between gc() and rm()gc() 和 rm() 有什么区别 【发布时间】:2012-02-07 11:35:48 【问题描述】:我定期通过调用 rm(list=ls())
来清理 R 中的内存。
之后我需要调用垃圾收集器gc()
吗?
这两个函数有什么区别? gc()
是否为某些变量调用 rm()
?
【问题讨论】:
【参考方案1】:首先,重要的是要注意两者非常不同,gc
不会删除您仍在使用的 任何 变量 - 它只会为您不使用的变量释放内存不再有权访问(无论是使用rm()
删除,还是说,在一个已经返回的函数中创建)。运行gc()
永远不会让你失去变量。
不过,在调用rm()
之后是否应该调用gc()
的问题是一个很好的问题。用于 gc 的 documentation 有用的注释:
调用 gc 会导致垃圾回收发生。这也将自动发生,无需用户干预,调用 gc 的主要目的是报告内存使用情况。
但是,在删除大对象后调用 gc 会很有用,因为这可能会提示 R 将内存返回给操作系统。
所以答案是打电话给gc()
会很好(至少不会受到伤害),即使它很可能会被触发(如果不是马上,那么很快)。
【讨论】:
感谢您的回答。一般来说,R自动垃圾收集是否被认为是好的? (例如,与 java 的一样健壮) 这是一个很难回答的问题,我不确定。 This question 很有用。 一般情况下你不应该调用gc,如果你这样做也不太可能有太大的不同。 @hadley 这与我的经验完全不符。相反,即使在大对象(大约几百 MiB)不再可用后,R 也经常导致我的操作系统进行交换。但是,手动调用gc()
可以避免这种情况。使用可用内存是可以的,不必要的交换确实不行,因为它会对操作系统的可用性产生负面影响。最先进的 GC 可以更好地处理这个问题。
第二个@KonradRudolph 的评论 - 在最近的一些工作中,我注意到函数的局部变量消耗了大量内存。当变量超出范围时,不会释放内存,就像在其他语言中一样。我不得不打电话给gc()
。【参考方案2】:
我个人喜欢在循环中包含gc()
,以便在循环开始填满可用空间时释放一些 RAM。类似的东西
for(i in 1:1000)
res[[i]] = some operation
gc()
【讨论】:
请注意,调用 gc() 会导致每次调用大约 100 毫秒的性能损失。因此,在这种情况下,您的代码将比必要的运行时间长约 100 秒 :)【参考方案3】:ReThankGoat 对 gc 惩罚的评论,虽然这是真的,但当然可以决定在循环中每 N 次迭代调用 gc(其中 N 可以通过多种方式参数化)。对于迭代次数较多但给定迭代中的资源使用量较少的循环,可能没有必要在每次迭代中都进行 GC 以重新获得所需的性能。
当然,如果您正在循环使用大量非常高使用率的迭代,那就另当别论了,但在那个阶段,很可能只需要对代码进行矢量化和/或什至编写用另一种语言。
【讨论】:
以上是关于gc() 和 rm() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
“git rm --cached”、“git restore --staged”和“git reset”有啥区别
MP3、MID、MMF、MFM、AMR、WMA ,RM,这些格式有啥区别啊?