0

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

我注意到每当我将 an 传递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

谢谢!

4

1 回答 1

2

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

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

简而言之,像在 R 中那样做,就可以了。

没有额外的副本。

于 2016-01-12T15:58:47.393 回答