如果.GlobalEnv中有一个名称指向在该本地环境中创建的data.table,是否会删除本地环境?

时间:2016-02-04 13:50:37

标签: r data.table

想象一下,我们的环境中包含一些局部变量以及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指向的数据将保留。 但vecllstl指向的数据如何:local()完成后是否会从内存中清除?或者它仍然会在内存中,因为local()的执行环境不会被删除,因为在这个环境中创建的数据有一个指针(dtG)(比如使用闭包时)?

1 个答案:

答案 0 :(得分:3)

没有vec1lst1的引用,因此会收集它们。验证这一点的一种方法是使用终结器创建环境。在环境被垃圾收集时运行终结器。所以

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