首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table:为未来的列预分配内存

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

Stack Overflow用户
提问于 2015-06-02 12:20:25
回答 1查看 1.4K关注 0票数 5

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

我们怀疑这是因为这个内存不是连续块的一部分,所以我们希望在创建data.table时预先分配更大的内存块。

一个明显的建议是创建所有的列,这些列最终将从另一个列中合并到我们的data.table中。但是,这并不一定会起作用,因为merge的设计目的不是用同名DT2的列覆盖DT1的列,而是将它们重命名,以便两者都可以保持。

还有什么可以做的吗?

最起码的例子:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2015-07-18 11:55:47

解决代码块中的问题:“希望以尽可能高内存效率的方式实现这一目标”。

您可以获得的最节省内存的方法是在执行联接时通过引用将列添加到x数据集中。

从最近的data.table的开发版本,v1.9.5开始,您不必在加入之前设置键。

代码语言:javascript
复制
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版本,您必须提前设置。

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30595913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档