删除全局变量并从函数中释放内存

时间:2019-05-29 13:37:09

标签: r memory

我需要从具有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,因为该函数会生成更多数据集,并且内存不足。

2 个答案:

答案 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,这对我正在做的事情至关重要