通过参考传递H2O框架

时间:2016-01-09 22:03:18

标签: r h2o

我正在处理一个非常大的数据集,我想尽可能地将数据保存在H2O中而不将其带入R.

我注意到每当我将H2O Frame传递给函数时,我对帧所做的任何修改都不会反映在函数之外。有没有办法通过引用传递框架?

如果没有,那么在复制所有Frame的情况下修改函数内原始帧的最佳方法是什么?

另一个相关问题:是否将Frame传递给其他函数(只读),在H2O端制作额外的副本?我的数据集是30GB - 100GB。因此,要确保传递它们不会导致内存问题。

mod = function(fdx) {
  fdx[,"x"] = -1
}

d = data.frame(x = rnorm(100),y=rnorm(100))
dx = as.h2o(d)
dx[1,]
mod(dx)
dx[1,]  # does not change the original value of x


 > dx[1,]
           x         y
 1 0.3114706 0.9523058

 > dx[1,]
           x         y
 1 0.3114706 0.9523058

谢谢!

1 个答案:

答案 0 :(得分:2)

H2O执行经典的写时复制优化。因此:

  • 除非您改变数据集,否则不会进行真正的复制。
  • 只有经过更改/添加的列才会被真正复制,所有其他列都会通过引用传递
  • R中的帧是按值传递,H2O模仿
  • Python中的框架是传递引用,H2O模仿

简而言之,就像在R中一样,你没事。

没有多余的副本。