R 语言垃圾回收(gc算法)

2017-09-30 YongHao Hu 更多博文 » 博客 » GitHub »

DNS

原文链接 http://yonghaowu.github.io/2017/09/30/R_gc/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


R 语言用的垃圾回收算法是 分代算法, 有一个小优化就是会用 name 字段来实现 copy on write.

  • 当 name 为0时, 没有任何人用它,可以删掉;
  • 当 name 为1时, 正在有表达式在用它,所以复制了一份;
  • 当 name 为2时, 证明有另一个变量指向了它,当修改时要复制一份出来.

因为是分代回收,所以函数里的临时变量都不会马上删掉, 而且每次重复赋值, 上一次的数据依然存在于内存. 这意味着, 你不断操作一个存了很大数据的变量时, 会占用非常多的内存, 此时便需要把不用的变量马上 gc 掉.

于是, 我包裹了一个小函数, 用于 rm 以及 gc.

    r_release <- function(var){
        environment()
        print(tracemem(var))
      # unlockBinding("var", .BaseNamespaceEnv)
        #rm(var)
        print(eval(var))
        print(class(eval(var)))
        print(sprintf("%s", var))
        rm(list = eval(var), envir=parent.frame())
        gc(verbose = FALSE)
    }

a <- 12
b <- 123
a
tracemem("a")
#print(unlockBinding("a", environment()))
r_release("a")
a