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

Posted

技术标签:

【中文标题】R 3.6.0 中的 data.table 包中是不是存在内存泄漏?【英文标题】:Is there a memory leak in the data.table package in R 3.6.0?R 3.6.0 中的 data.table 包中是否存在内存泄漏? 【发布时间】:2018-05-11 19:12:00 【问题描述】:

在 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())

返回(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

有什么想法吗?

对“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   

【问题讨论】:

我假设您知道可以报告问题的 data.table github 页面? github.com/Rdatatable/data.table/issues。如果在正确的地方报告,特定于开发版软件的问题更有可能由正确的人解决。 如果 refcount 语义(你好,ALTREP)的变化导致了这个问题,仍然可能是一个 R Core 问题...... 无论如何,R 3.6.0 是 11 1/2 个月,所以 ... @MrFlick,我必须在提交问题之前在这里发帖。我同意这只是一个问题会更好,但我明白为什么他们要求使用拥有如此多用户的软件包。 @DirkEddelbuettel 我不明白。我正在导入 data.table ,当我使用它时, data.table 会导致我要提交的包失败检查(R 会吃掉所有内存,然后接下来发生的事情有点不稳定)。我可以说这是我的问题,因为我可以删除 data.table 行并且包通过检查(但结果不好)。它在 R 3.4 中也可以正常工作 【参考方案1】:

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

当前的里程碑(下一个版本)是 1.11.4,那里有几个相关的问题。是什么让你认为我们不想让你提出问题?我猜issue template 的要点 3。我现在已经把这些点改得更清楚了,我希望。您是一名软件包开发人员,目前在使用尚未发布的 R 3.6.0 和最近发布的 data.table 时遇到问题,因此应该在 GitHub 上。

【讨论】:

查看github.com/Rdatatable/data.table/issues/2866 我将其标记为答案,因为它就是答案:是的,它是真实的。 非常感谢。我已将其标记为 1.11.4,我会从今天开始查找。 对我来说(由 Luke Tierney 建议)的短期解决方案是将 data.table::setDTthreads(1) 放入我的包中,以防止显然是一种竞争条件——而不是记忆泄漏。

以上是关于R 3.6.0 中的 data.table 包中是不是存在内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

R闪亮包中的父/子行

如何在不导入所有函数的情况下在包中使用 data.table?

data.table 包中的 := (按引用传递)运算符同时修改另一个数据表对象

为啥 `data.table::unique` 不起作用?

如何计算 R 中 data.table 中的出现组合

R:data.table 中的透视和小计?