R -数据.表:为将来的列预分配内存



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

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

一个明显的建议是只创建最终将合并到我们的数据中的所有列。从另一张桌子开始。然而,这并不一定会起作用,因为merge的设计不是用具有相同名称的DT2的列覆盖DT1的列,而是重命名它们,以便两者都可以保留。

还有什么可以做的吗?

最小的例子:

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)

解决代码块中的问题:"希望以最节省内存的方式发生"
您可以获得的最节省内存的方法是在执行连接时通过引用向x数据集添加列。

自最近开发版本的数据。在v1.9.5中,不需要在join之前设置key。

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"]

如果你没有最近的数据。表版你必须提前设置密钥。

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]

最新更新