R 3.6.0中的data.table包中是否存在内存泄漏?

pdb*_*pdb 10 memory-leaks r data.table

在R 3.6.0(预发布)中,我只有 data.table包中的内存泄漏.这发生在CRAN版本以及GH版本上.

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())
Run Code Online (Sandbox Code Playgroud)

退货(仅限 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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

"get"和"by"的调用似乎都是必要的.`[,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   
Run Code Online (Sandbox Code Playgroud)

Mat*_*wle 12

好极了!一个可重复的例子.我们在这个领域已经挣扎了几个星期.您的示例看起来非常有用.请加入我们的GitHub.

目前的里程碑(下一个版本)是1.11.4,那里有几个相关的问题.是什么让你觉得我们不想让你提出问题?我想问题模板的第3点.我希望,现在我已经把这些要点改为更清楚了.你是一个软件包开发人员,目前尚未发布R 3.6.0以及最近发布的data.table,因此应该在GitHub上.

在此输入图像描述

  • 查看 https://github.com/Rdatatable/data.table/issues/2866 我将其标记为答案,因为它是答案:是的,它是真实的。 (2认同)
  • 非常感谢。我已将其标记为 1.11.4,今天我将开始查看。 (2认同)