gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:02:20 27 4
gpt4 key购买 nike

想象一下,我们有一个环境,其中包含一些局部变量和一个 data.table。

local({
vecl <- 1:10
lstl <- as.list(1:10)
dtl <- data.table(num = 1:3, chr = letters[1:3])

.GlobalEnv$dtG <- dtl
})

预计名称指向的数据 dtl由于 data.table 的 by-reference 本质,将保留。
但是数据呢, vecllstl指向: local()之后是否会从内存中清除完成?否则它仍然会坐在内存中,因为 local()的执行环境不会因为有一个指向在此环境中创建的数据的指针( dtG )而被删除(例如使用闭包时)?

最佳答案

没有引用 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

关于r - 如果 .GlobalEnv 中的名称指向在该本地环境中创建的 data.table,是否会删除本地环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35202803/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com