首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除data.table中的行和尖峰内存使用

删除data.table中的行和尖峰内存使用
EN

Stack Overflow用户
提问于 2014-10-30 16:51:52
回答 1查看 309关注 0票数 0

我有一个相当大的89M行的data.table,3.7Gb。钥匙就位了,所以一切都准备好了。但是,当我根据列的值删除行时,我遇到了一个问题。内存的使用简直是天翻地覆!

为了记录在案,我看过这里的其他帖子,但它们并没有多大帮助。另外,我使用的是RStudio,我很确定这并不理想,但它在实验中很有帮助,但是我在R控制台中注意到了同样的行为。我在使用Windows。

让我发布一个创建一个非常大的data.table (大约1e6x100 )的例子(取自一个关于行删除的类似问题)。

代码语言:javascript
运行
复制
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。这是我们的出发点。

让我们移除值列(熔体之后)为4的所有行。

代码语言:javascript
运行
复制
DT.m<-DT.m[value!=4]

最后一行占用了大量的内存!在执行这一行之前,在我的PC中,内存使用量约为4.3Gb,而在执行该行之后,它将达到6.9Gb!

这是移除线条的正确方法,对吗?(只是检查一下)。以前有人见过这种行为吗?

我想在另一个data.table中循环所有参数并保留我感兴趣的行,但不知何故,我怀疑这是一种正确的工作方式。

我期待着你的帮助。

谢谢尼科斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-30 19:12:25

更新:用此承诺替换逻辑向量以节省内存(请阅读下面的文章以获得更多信息)。固定在1.9.5。

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

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

合计4.3+1.8+0.72 =~ 6.8GB

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

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

通常,which会产生一个小得多(可以忽略不计的)值--因此子集更快--这就是使用which()的原因。但是在这种情况下,您需要删除97行。

但很高兴知道我们能节省一点记忆。你能提出一个问题这里吗?

,#635在实现时,应该是快速的和内存高效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26658835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档