【问题标题】:Removing lines in data.table and spiking memory usage删除 data.table 中的行并增加内存使用量
【发布时间】: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


【解决方案1】:

更新:使用this commit,逻辑向量被行索引替换以节省内存(阅读下面的帖子了解更多信息)。已在 1.9.5 中修复。


sum(DT.m$value == 4L) 给了我97。也就是说,您要从 9700 万行中删除总共 97 行。这反过来意味着子集操作也将返回约 1.8GB 的​​数据集。

  • 您的内存使用量一开始是 4.3GB
  • 您提供的条件 value == 4 占用大小为 9700 万 =~360MB 的逻辑向量的空间。
  • data.table 计算 which(that_value) 以获取索引 = 几乎所有行 = 另一个 360MB
  • 作为子集的数据必须首先分配到其他地方,大约为 1.8GB。

总计 4.3+1.8+0.72 =~ 6.8GB

垃圾收集还没有发生。如果现在做gc(),应该释放旧DT.m对应的内存。

我可以看到我们可以节省空间的唯一地方是用整数向量替换逻辑向量(而不是将整数索引存储在另一个向量中)以节省额外的 360MB 空间。

通常which 会产生更小的(可忽略的)值 - 因此子集更快 - 这就是使用which() 的原因。但在本例中,您删除了 97 行。

但很高兴知道我们可以节省一点内存。能否请您提出问题here

Removing rows by reference, #635,在实现时,应该既快速又节省内存。

【讨论】:

  • 嗨@Arun,感谢您的详细反馈。我不是在质疑数学,我只是想知道这种行为是否是 data.table 内部预期的行为。这是产生一些问题的计算的最后一步。谢谢。
  • 嗨@Arun,是否有可能通过引用删除行是你们将推动 1.9.5/1.9.6 版的下一个功能?这将是对已经非常出色的 data.table 的一个很大的改进,恕我直言 =)
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2012-01-24
相关资源
最近更新 更多