require(data.table)
n <- 2e6
df <- data.frame(a=rnorm(n),
b=factor(rbinom(n,5,prob=0.5),1:5,letters[1:5]),
c=factor(rbinom(n,5,prob=0.5),1:5,letters[1:5]))
dt <- setDT(df)
print(pryr::mem_used())
fff <- function(aref) {
ff <- lapply(1:5, function(i) {
dt2 <- dt[,list(sumA=sum(get(aref))),by=b][,c:=letters[i]]
dt2
})
return(rbindlist(ff))
}
for(i in 1:10) {
f <- fff("a")
rm("f")
gc()
print(pryr::mem_used())
}
gc()
print(pryr::mem_used())
返回(仅限3.6.0 )
81.2 MB
81.2 MB
81.2 MB
184 MB
287 MB
390 MB
493 MB
596 MB
699 MB
802 MB
任何想法?
致电&#34; get&#34; &#34; by&#34;似乎是必要的。 `[,c:= letters [i]]不是,但它会使内存泄漏显得更快。
我的会话信息
> sessionInfo()
R Under development (unstable) (2018-05-10 r74708)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.11.3
loaded via a namespace (and not attached):
[1] compiler_3.6.0 pryr_0.1.4 magrittr_1.5 tools_3.6.0
[5] Rcpp_0.12.16 stringi_1.1.7 codetools_0.2-15 stringr_1.3.0
答案 0 :(得分:11)
耶!一个可重复的例子。我们在这个领域已经挣扎了几个星期。您的示例看起来非常有用。请加入我们的GitHub。
目前的里程碑(下一个版本)是1.11.4,那里有几个相关的问题。是什么让你觉得我们不想让你提出问题?我想是issue template的子弹点3。我希望,现在我已经把这些要点改为更清楚了。你是一个软件包开发人员,目前尚未发布R 3.6.0以及最近发布的data.table,因此应该在GitHub上。