我有一个相当大的89M行的data.table,3.7Gb。钥匙就位了,所以一切都准备好了。但是,当我根据列的值删除行时,我遇到了一个问题。内存的使用简直是天翻地覆!
为了记录在案,我看过这里的其他帖子,但它们并没有多大帮助。另外,我使用的是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。这是我们的出发点。
让我们移除值列(熔体之后)为4的所有行。
DT.m<-DT.m[value!=4]最后一行占用了大量的内存!在执行这一行之前,在我的PC中,内存使用量约为4.3Gb,而在执行该行之后,它将达到6.9Gb!
这是移除线条的正确方法,对吗?(只是检查一下)。以前有人见过这种行为吗?
我想在另一个data.table中循环所有参数并保留我感兴趣的行,但不知何故,我怀疑这是一种正确的工作方式。
我期待着你的帮助。
谢谢尼科斯
发布于 2014-10-30 19:12:25
更新:用此承诺替换逻辑向量以节省内存(请阅读下面的文章以获得更多信息)。固定在1.9.5。
做sum(DT.m$value == 4L)给了我97。也就是说,您要从9,700万行中总共删除97行。这又意味着子集操作也将返回~1.8GB数据集。
value == 4占用了大小为9700万=~360 97的逻辑向量的空间。which(that_value)来获取索引=几乎所有行=另一个360 to合计4.3+1.8+0.72 =~ 6.8GB
垃圾收集还没发生。如果现在执行gc(),则应该释放与旧DT.m对应的内存。
我看到的唯一可以节省空间的地方是用整数向量替换逻辑向量(而不是将整数索引存储在另一个向量中),以节省额外的360 of空间。
通常,which会产生一个小得多(可以忽略不计的)值--因此子集更快--这就是使用which()的原因。但是在这种情况下,您需要删除97行。
但很高兴知道我们能节省一点记忆。你能提出一个问题这里吗?
,#635在实现时,应该是快速的和内存高效的。
https://stackoverflow.com/questions/26658835
复制相似问题