data.table:为将来的列预分配内存

时间:2015-06-02 12:20:25

标签: r data.table

我们有一个非常大的data.table,我们追加列,主要是data.table.merge。有时,这会触发"Cannot allocate vector of size xx Gb"错误,即使我们知道系统上有这么多可用内存。

我们怀疑这是因为这个内存不是连续块的一部分,所以我们想在创建data.table时以某种方式预分配更大的RAM。

一个明显的建议是在一开始就创建最终将从另一个列合并到我们的data.table中的所有列。但是,这不一定会起作用,因为merge的目的不是用DT1的{​​{1}}覆盖DT2的列,而是将它们重命名为两者都可以保留。

还有什么可以做的吗?

最小例子:

x = data.table(a = 1:10, b=2:11)
y = data.table(a = 1:10, c=2:11)

# want this to happen in the most memory-efficient way possible 
# and ideally without allocating new memory at all 
# (i.e., want to be able to pre-allocate enough memory in x 
# in line 1 to be able to do this)
x = merge(x, y, by=a)

1 个答案:

答案 0 :(得分:1)

从代码块中解决问题:"希望以最节省内存的方式实现这一点"
您可以获得的内存效率最高的是在进行连接时通过引用向x数据集添加列。

由于最近devel version of data.table, v1.9.5你不必在加入之前使用setkey。

library(data.table)
x = data.table(a = 1:10, b=2:11)
y = data.table(a = 1:10, c=2:11)
x[y, c := i.c, on="a"]

如果你没有最新的data.table版本,你必须事先设置setkehy。

library(data.table)
x = data.table(a = 1:10, b=2:11, key="a")
y = data.table(a = 1:10, c=2:11, key="a")
x[y, c := i.c]