我有一个大约 900MB 内存的大数据框。然后我尝试像这样修改它:
dataframe[[17]][37544]=0
似乎使 R 使用超过 3G 的内存,并且 R 提示“错误:无法分配大小为 3.0 Mb 的向量”,(我在 32 位机器上。)
我发现这种方式更好:
dataframe[37544, 17]=0
但是 R 的占用空间仍然增加了一倍,并且该命令需要相当长的时间才能运行。
从 C/C++ 背景来看,我对这种行为感到非常困惑。我想像
dataframe[37544, 17]=0
应该在不消耗任何额外内存的情况下瞬间完成(只需修改一个单元格)。 R 对我发布的那些命令做了什么?那么在不使内存占用加倍的情况下修改数据框中的某些元素的正确方法是什么?非常感谢你的帮助!
陶
最佳答案
跟进 Joran 的建议 data.table
,这里有一些链接。您的对象(大小为 900MB)即使在 32 位 R 中也可以在 RAM 中进行管理,根本没有副本。
When should I use the :=
operator in data.table?
Why has data.table defined :=
rather than overloading <-?
另外, data.table
v1.8.0(尚未在 CRAN 上,但在 R-Forge 上稳定)具有 set()
提供更快分配元素的函数,与分配给 matrix
的速度一样快(例如,适合在循环内使用)。见 latest NEWS有关更多详细信息和示例。另见 ?":="
链接自 ?data.table
.
而且,这里是 12 questions在 Stack Overflow 上使用 data.table
包含“引用”一词的标签。
为了完整性:
require(data.table)
DT = as.data.table(dataframe)
# say column name 17 is 'Q' (i.e. LETTERS[17])
# then any of the following :
DT[37544, Q:=0] # using column name (often preferred)
DT[37544, 17:=0, with=FALSE] # using column number
col = "Q"
DT[37544, col:=0, with=FALSE] # variable holding name
col = 17
DT[37544, col:=0, with=FALSE] # variable holding number
set(DT,37544L,17L,0) # using set(i,j,value) in v1.8.0
set(DT,37544L,"Q",0)
但是,请查看链接的问题和包的文档以了解如何
:=
比这个简单的例子更通用;例如,结合 :=
在 i
中进行二分查找加入。
关于r - 修改大 R data.frame 时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9508118/