【问题标题】:bind data without copying绑定数据而不复制
【发布时间】:2016-05-20 16:45:13
【问题描述】:

我正在运行一个程序,它生成几列数百万行,cbinds,然后打印。我正在尝试使该过程更有效地使用内存,并且想知道以下是复制数据还是仅复制点。

x<-rnorm(3,1,1)
y<-rnorm(3,2,2)
z<-rnorm(3,3,3)
M<-cbind(x,y,z)

其中一个答案Understanding exactly when a data.table is a reference to (vs a copy of) another data.table 暗示没有复制数据,但命令 .Internal(inspect(M)) 似乎不同意。

一个简单的内存解决方案是在运行 fi 之前声明 M 并将值声明为 M。我听说 data.tables 可以非常有效地保存大型数据集。在这种情况下有什么方法可以使用吗?

【问题讨论】:

  • 请做一个可重现的例子。
  • 你在使用 data.tables 吗?还是这些标准的 R 向量?矩阵?数据帧?如果您提供某种可用于测试的reproducible example,将会有所帮助。
  • 对于它的价值,如果 x 和 y 是 data.tables x = data.table(a = 1); y = data.table(b = 2); m = setDT(c(x,y)) 尝试 sapply(x, address); sapply(y, address); sapply(m, address),你会看到列共享地址。我很确定它也适用于 data.frames。
  • 我的理解是任何类型的联接、合并或绑定都涉及复制。唯一没有的操作是 :=set 函数系列。
  • 我想到的术语是来自 Andrie 的一个问题stackoverflow.com/q/15759117的“修改时复制”@

标签: r memory-management data-binding data.table


【解决方案1】:

这是一种无需复制/引用即可将向量放入 data.table 的方法(需要 R 3.1.1+ iirc)。

x = 1:5
y = 5:1

dt = setDT(list(x, y))
#   V1 V2
#1:  1  5
#2:  2  4
#3:  3  3
#4:  4  2
#5:  5  1

dt[3, V1 := 10]
#   V1 V2
#1:  1  5
#2:  2  4
#3: 10  3
#4:  4  2
#5:  5  1

x
#[1]  1  2 10  4  5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2019-01-03
    • 1970-01-01
    • 2011-07-30
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多