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