相关疑难解决方法(0)

使用gc()命令强制垃圾收集在R中运行

我定期编程.好吧,我一直在编程,但有时会以内存错误的形式赶上我.我开始在使用rm()命令删除对象时执行一些纪律,事情变得更好.我在网上看到有关gc()在删除大型数据对象后是否应该显式调用的混合消息.有人说在R返回内存错误之前它会运行,gc()而其他人则说手动强制gc是一个好主意.

我应该gc()在删除大型对象后运行以确保最大的内存可用性吗?

garbage-collection r

64
推荐指数
6
解决办法
3万
查看次数

为什么函数内的rm不能删除对象?

rel.mem <- function(nm) {
  rm(nm)
}
Run Code Online (Sandbox Code Playgroud)

我定义了上面的函数rel.mem - 接受一个参数并将其传递给rm

> ls()
[1] "rel.mem"
> x<-1:10
> ls()
[1] "rel.mem" "x"      
> rel.mem(x)
> ls()
[1] "rel.mem" "x"    
Run Code Online (Sandbox Code Playgroud)

现在你可以看到我称之为rel.mem x没有被删除 - 我知道这是由于正在尝试rm的环境不正确.

对此有什么好处?

一个好的修复的标准:

  1. 呼叫者不应该通过环境
  2. 被调用者(rel.mem)应该能够通过使用R语言工具(调用栈检查,方面等)来确定环境.
  3. 函数rel.mem的接口应该保持简单 - 白痴证明:调用rel.mem - 然后rel.mem从那里获取它 - 不需要通过环境.

笔记:

  1. 正如许多评论者指出的那样,一个简单的解决办法是通过环境.
  2. 我的意思是一个好的修复[我应该澄清它]是被调用函数(在这种情况下是rel.mem)能够在调用者引用时计算/找出环境,然后从中删除对象合适的环境.
  3. "2"中的推理类型可以通过检查调用堆栈在其他语言中完成 - 例如在Java中我会抛出一个虚拟异常 - 捕获它然后解析调用堆栈.在其他语言中,我仍然可以使用面向方面的技术.问题是可以在R中完成吗?
  4. 正如一位评论者提出可能存在多个具有相同名称的对象,因此"正确"的环境毫无意义 - 正如我在上面所述,在其他语言中,有可能(有时带有一些创造性的诡计)来解释呼叫-stack - 这在R中可能是不可能的
  5. 正如一位评论者所建议的那样,rm(list = nm,envir = parent.frame())将从父环境中删除它.这是正确的 - 但是我正在寻找适用于任意调用深度的东西.

r

5
推荐指数
1
解决办法
1421
查看次数

标签 统计

r ×2

garbage-collection ×1