R数据表内存有效的rbindlist
我想以一种节省内存的方式查找多个数据表 更准确地说,我想一个接一个地查找它们,并在移动中释放内存,这样当我的内存只有(n+1)*k时,我就可以加入n数据表k 我写了这个函数,希望能做到这一点: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)
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的解决方案,而不是在内存中。