我们有一个非常大的data.table
, 我们主要通过 data.table.merge
附加列.有时,这会触发 "Cannot allocate vector of size xx Gb"
错误,即使我们知道系统上有这么多可用内存。
我们怀疑这是因为该内存不是连续 block 的一部分,因此我们希望在创建 data.table 时以某种方式预先分配更大的 RAM block 。
一个明显的建议是从一开始就创建所有最终将合并到我们的 data.table 中的列。然而,这并不一定会奏效,因为 merge
旨在不覆盖 DT1
的列与 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)
最佳答案
从代码块中解决问题:“希望以最节省内存的方式发生”。
您可以获得的最节省内存的方法是将列添加到您的 x
在进行连接时通过引用进行数据集。
由于最近devel version of data.table, v1.9.5您不必在加入之前设置 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"]
如果您没有最新的 data.table 版本,则必须提前设置。
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]
关于r - data.table:为将来的列预分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595913/