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

标签 r data.table

我们有一个非常大的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/

相关文章:

r - 滞后函数返回 NA

r - 组 id 内的 data.table

r - data.table 中的多个正则表达式匹配和赋值

r - fread 无法读取第一列为空的 .csv 文件

r - Data.table - 减去列对

r - 检查一个数据框中的日期是否在另一个数据框中的日期范围内,并在为真时返回行

R:Rvest - 得到了我不想要的隐藏文本

r - 什么时候不应该使用 assignInNamespace?

r - 如何将数字向量转换为R中的字符串?

重命名查找表中的列