【问题标题】:Passing H2O Frames by Reference通过引用传递 H2O 帧
【发布时间】:2016-01-13 00:05:09
【问题描述】:

我正在处理一个非常大的数据集,我希望尽可能将数据保留在 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

谢谢!

【问题讨论】:

  • data.table 具有与使用reference 类似的机制,但我不确定它是否可以用于您的情况。你可以看看here

标签: r h2o


【解决方案1】:

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

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

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

没有额外的副本。

【讨论】:

  • 谢谢,@Cliff。确认:没有data.table esque 方式来改变原始表,但读取很好。现在,我将向量返回给调用者,调用者将其分配给框架在范围内的 h2o,以避免本地复制。我不确定的另一件事是当你这样做时会发生什么(在主要范围内):dx = dx[dx$col > 5,]。两个帧都在 H2O 端的内存中吗?
  • H2O 在某些情况下会在 H2O 端进行就地更新优化,并且在任何情况下通常都会快速回收 Big Temps。对于行选择器的情况,是的,两个帧都在内存中。在下一次 R GC 时,'dx' 的旧副本将被回收。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 2015-01-12
  • 2013-09-10
  • 2020-04-01
  • 1970-01-01
  • 2011-06-28
  • 2015-07-22
  • 2015-05-02
相关资源
最近更新 更多