R数据表内存有效的rbindlist

R数据表内存有效的rbindlist,r,list,memory,data.table,R,List,Memory,Data.table,我想以一种节省内存的方式查找多个数据表 更准确地说,我想一个接一个地查找它们,并在移动中释放内存,这样当我的内存只有(n+1)*k时,我就可以加入n数据表k 我写了这个函数,希望能做到这一点: rbindlistOneByOne <- function(l, use.names=FALSE, fill=FALSE, idcol=NULL, verbose = F) { ll <- length(l) # Handle empty lists if(ll <= 0)

我想以一种节省内存的方式查找多个数据表

更准确地说,我想一个接一个地查找它们,并在移动中释放内存,这样当我的内存只有(n+1)*k时,我就可以加入n数据表k

我写了这个函数,希望能做到这一点:

rbindlistOneByOne <- function(l, use.names=FALSE, fill=FALSE, idcol=NULL, verbose = F) {
  ll <- length(l)
  # Handle empty lists
  if(ll <= 0) stop("rbindlistOneByOne : empty list")
  if(ll <= 1) return(l[[1]])
  # Handle normal lists (ll > 2)
  current <- l[[1]]
  res <- current
  l[1] <- NULL
  rm(current); gc()
  for(i in 2:ll) {
    current <- l[[1]]
    res <- rbindlist(list(res, current), use.names = use.names, fill = fill, idcol = idcol)
    l[1] <- NULL
    rm(current); gc()
  }
  return(res)
}

rbindlistOneByOne没有办法做你想做的事。内存释放在R中是随机的,你无法控制它。
gc()
的使用可能会释放内存,也可能不会释放内存,并且不受用户控制

发件人:

尽管您可能在其他地方读过,但您永远不需要自己调用gc()。R将在需要更多空间时自动运行垃圾收集;如果你想知道什么时候是,请致电gcinfo(TRUE)。您可能希望调用gc()的唯一原因是要求R将内存返回到操作系统。然而,即使这样也可能没有任何效果:旧版本的Windows无法让程序将内存返回操作系统

此外,调用
gc
的速度非常慢。这里是您的函数的一个基准,可以调用或不调用
gc
,以获得10行1000个表的列表

  • 无gc时
:8 ms
  • 使用
    gc
    :7秒

  • rbindlist
    是绑定
    数据最有效的方法。table

    如果使用
    数据会发生什么。table
    的内置
    rbindlist()
    函数?我也遇到了同样的问题
    gc()
    也没有像我想要的那样从内存中删除。我解决这个问题的(非常低效的方法)是执行一系列操作,写入RDS文件,删除对象,然后清除内存,读回RDS文件,然后继续操作。我正在最大限度地使用本地内存,而R将崩溃,因此我不得不采用这种方法。
    gc()
    不会释放内存。在R中,内存分配是确定的,但内存释放是随机的。无法在R中执行您想要执行的操作。最好的方法是
    rbindlist
    哪一种是内存效率最高的方法创建或加载了哪些数据表?是否有机会在流程链的早期绑定表?谢谢。我将在ROM中寻找rbind的解决方案,而不是在内存中。