나는 효율적인 방법으로 여러 datatables를 rbind하고 싶습니다. 더 정확하게R data.table 메모리 효율적인 rbindlist
, 내 기억은 크기 의 경우 나는 (I 크기 K의 N data.tables에 가입 할 수 있도록, 그들에게 이동에 하나씩, 무료 메모리를 rbind 싶습니다 n + 1) * 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)
}
이제 문제는이 기능 하지 메모리 효율적이다 :
나는 그렇게 희망이 기능을 썼다.이유를 알고 계십니까? RM이 메모리를 비우지 않아서 "현재"라는 data.table이 메모리에 남아 있기 때문입니까?
'data.table'의 내장'rbindlist()'함수를 사용하면 어떻게됩니까? – Uwe
l - 딥 복사가 없으므로 rbindlist (l)은 매우 효율적입니다. – Roland
나는'gc()'가 내가 원하는 것처럼 메모리에서 제거하지 않은 똑같은 문제를 겪었다. (매우 비효율적 인 방식으로)이 작업은 일련의 작업을 수행하고 RDS 파일에 쓰고 개체를 삭제 한 다음 메모리를 지우고 RDS 파일을 다시 읽은 다음 작업을 계속하는 것입니다. 나는이 접근법을 취해야 만 했으므로 로컬 메모리를 최대한으로 활용하고 있었다. –