我需要从具有R的函数内部删除全局变量并释放它正在使用的内存,但是我尝试过的所有选项都没有。
我已经尝试使用envir参数和rm功能来运行rm函数,但是gc不会释放内存。我还尝试使用eval + envir在全局环境中运行gc。
library(data.table)
DT = data.table(col1 = 1:1e6)
cols = paste0('col', 2:100)
for (col in cols){ DT[, col := 1:1e6, with = F] }
rm_and_release <- function(dt){
dt <- dt[sample(1e6, 9e5, FALSE)]
print(gc())
rm(DT, envir = globalenv())
print(gc())
}
rm_and_release(DT)
结果如下
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 661556 35.4 1168576 62.5 1143443 61.1
Vcells 96303112 734.8 146725516 1119.5 146722586 1119.5
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 661569 35.4 1168576 62.5 1143443 61.1
Vcells 96303114 734.8 146725516 1119.5 146722586 1119.5
我希望第二个gc()释放更多的内存,因为那时只有一个数据集,因为已删除了全局DT。
我需要释放函数内部的RAM,因为该函数会生成更多数据集,并且内存不足。
答案 0 :(得分:0)
像这样使用list=
的{{1}}参数:
rm
这是我在Windows上运行时的日志:
library(data.table)
DT = data.table(col1 = 1:1e6)
cols = paste0('col', 2:100)
for (col in cols){ DT[, col := 1:1e6, with = F] }
rm_and_release <- function(dt){
dt <- dt[sample(1e6, 9e5, FALSE)]
print(gc())
rm(list = "DT", envir = globalenv())
print(gc())
}
rm_and_release(DT)
exists("DT")
## [1] FALSE
答案 1 :(得分:0)
我发现了一些有效的代码
library(data.table)
DT = data.table(col1 = 1:1e6)
cols = paste0('col', 2:100)
for (col in cols){ DT[, col := 1:1e6, with = F] }
rm_and_release <- function(){
dt <- copy(DT)
dt <- dt[sample(1e6, 9e5, FALSE)]
print(gc())
rm(DT, envir = globalenv())
print(gc())
}
rm_and_release()
结果为
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 865272 46.3 1442291 77.1 1280599 68.4
Vcells 96733883 738.1 167167064 1275.4 147681076 1126.8
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 865173 46.3 1442291 77.1 1280599 68.4
Vcells 46731629 356.6 133733651 1020.4 147681076 1126.8
我认为不插入DT作为函数的参数是非常丑陋的,但是至少在这种情况下,内存从738Mb降低到356Mb,这对我正在做的事情至关重要