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”有啥区别

新西兰GC、GD、PGD区别是啥呢?分别有啥优势呢?

MP3、MID、MMF、MFM、AMR、WMA ,RM,这些格式有啥区别啊?

git rm --cached 文件名 与git reset HEAD -- 文件名有啥区别?

orm 和 ADO.net 有啥区别?

请问linux命令上的选项和参数两者有啥区别