想象一下,我们的环境中包含一些局部变量以及data.table。
local({
vecl <- 1:10
lstl <- as.list(1:10)
dtl <- data.table(num = 1:3, chr = letters[1:3])
.GlobalEnv$dtG <- dtl
})
由于data.table的by-reference本质,预计名称dtl
指向的数据将保留。
但vecl
和lstl
指向的数据如何:local()
完成后是否会从内存中清除?或者它仍然会在内存中,因为local()
的执行环境不会被删除,因为在这个环境中创建的数据有一个指针(dtG
)(比如使用闭包时)?
答案 0 :(得分:3)
没有vec1
或lst1
的引用,因此会收集它们。验证这一点的一种方法是使用终结器创建环境。在环境被垃圾收集时运行终结器。所以
dtl <- local({
env <- new.env()
reg.finalizer(env, function(...) message("cleaning"))
data.table(num = 1:3, chr <- letters[1:3])
})
然后
> gc()
cleaning
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 309015 16.6 592000 31.7 460000 24.6
Vcells 530523 4.1 1023718 7.9 785050 6.0
相比之下,
fun <- local({
env <- new.env()
reg.finalizer(env, function(...) message("cleaning"))
function() {}
})
和
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 309038 16.6 592000 31.7 460000 24.6
Vcells 530159 4.1 1023718 7.9 785050 6.0
> rm(fun)
> gc()
cleaning
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 309152 16.6 592000 31.7 460000 24.6
Vcells 530516 4.1 1023718 7.9 785050 6.0