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 包中是不是存在内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不导入所有函数的情况下在包中使用 data.table?