【发布时间】:2014-12-26 20:07:46
【问题描述】:
我有一个大小合适的 89M 行、3.7Gb 的 data.table。钥匙已到位,因此一切都已正确设置。但是,当我根据列的值删除行时遇到问题。内存使用量简直是天翻地覆!
为了记录,我已经阅读了这里的其他帖子,但它们并没有太大帮助。另外,我正在使用 RStudio,我很确定它并不理想,但它在试验时会有所帮助,但是我注意到 R 控制台中的行为相同。我正在使用 Windows。
让我发布一个示例(取自关于删除行的类似问题)创建一个非常大的 data.table 大约 1e6x100
rm(list=ls(all=TRUE)) #Clean stuff
gc(reset=TRUE) #Call gc (not really helping but whatever..)
dimension=1e6 #let's say a million
DT = data.table(col1 = 1:dimension)
cols = paste0('col', 2:100) #let these be conditions as columns
for (col in cols){ DT[, col := 1:dimension, with = F] }
DT.m<-melt(DT,id=c('col1','col2','col3'))
好的,现在我们有一个包含 97M 行的 data.table,大约 1.8Gb。这是我们的出发点。
让我们删除 value 列(融化后)的所有行,例如4
DT.m<-DT.m[value!=4]
最后一行占用大量内存!在执行此行之前,在我的 PC 中,内存使用量约为 4.3Gb,而在执行此行之后,它会变为 6.9Gb!
这是删除线条的正确方法,对吗? (只是检查)。有没有人遇到过这种行为?
我想过循环所有参数并将我感兴趣的行保存在另一个 data.table 中,但不知何故我怀疑这是一种正确的工作方式。
期待您的帮助。
谢谢 尼科斯
【问题讨论】:
-
您刚刚将一个 1e6 x 1 的 data.table 变成了一个 1e6 x 100 的数据表。
-
@BondedDust 也许这个问题还不清楚。我会改写,但问题是为什么删除行会增加内存使用量。 1e6x100 data.table 很好。
-
好吧,代码向我表明,您不仅要创建 100 倍大的数据表,而且还要循环执行 100 次。我认为您应该尝试使用较小的测试用例来了解真正创建的内容。
标签: r memory memory-leaks data.table