我们有一个非常大的data.table,我们追加列,主要是data.table.merge.偶尔,这会触发"Cannot allocate vector of size xx Gb"错误,即使我们知道系统上有可用的内存量.
我们怀疑这是因为这个内存不是连续块的一部分,所以我们想在创建data.table时以某种方式预分配更大的RAM.
一个明显的建议是在一开始就创建最终将从另一个列合并到我们的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)
Run Code Online (Sandbox Code Playgroud)
解决代码块中的问题:“希望以最节省内存的方式发生这种情况”。
最节省内存的方法是x在执行连接时通过引用将列添加到数据集。
从最近的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"]
Run Code Online (Sandbox Code Playgroud)
如果您没有最新的 data.table 版本,则必须提前设置 keyhy。
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]
Run Code Online (Sandbox Code Playgroud)