假设我在一个4节点的H2O集群上有20个帧: a1..a5、b1..b5、c1..c5、d1..d5。我想把它们组合成一个大框架,我将从这个框架中建立一个模型。
是先合并多组列,然后再合并行:
h2o.rbind(
h2o.cbind(a1, b1, c1, d1),
h2o.cbind(a2, b2, c2, d2),
h2o.cbind(a3, b3, c3, d3),
h2o.cbind(a4, b4, c4, d4),
h2o.cbind(a5, b5, c5, d5)
)或者,先合并行,再合并列:
h2o.cbind(
h2o.rbind(a1, a2, a3, a4, a5),
h2o.rbind(b1, b2, b3, b4, b5),
h2o.rbind(c1, c2, c3, c4, c5),
h2o.rbind(d1, d2, d3, d4, d5)
)为了便于讨论,1/2/3/4/5可能代表一个月的数据,这就是为什么它们被单独导入的原因。和a/b/c/d是不同的功能集,这再次解释了为什么要单独导入它们。假设a1..a5有1728列,b1..b5有113列,c1..c5有360列,d1..d5是单列(我将对此进行建模)。(尽管我怀疑,因为H2O是一个列数据库,所以a/b/c/d中的相对列数并不重要?)
我所说的“更好”是指更快,但如果其中之一存在内存使用差异,那也是一件很好的事情:我主要对大数据情况感兴趣,在这种情况下,组合框架足够大,以至于我无法将其放入单个节点的内存中。
发布于 2016-09-15 16:43:22
我现在很确定答案是:无关紧要。
要点1:问题中的两个例子是相同的。这是因为h2o.cbind()和h2o.rbind()都使用了惰性计算。因此,无论哪种方式,它都会立即返回,并且在您执行某些操作之前什么都不会发生。(我一直在使用nrow()或ncol()强制创建新框架-它还允许我检查是否获得了我所期望的内容。)
要点2:一位H2O开发人员告诉我,它们没有区别(CPU或内存),因为无论哪种方式,数据都会被复制。
要点3:我没有注意到在一些相当大的cbind/cbind上有任何显著的速度差异,最终帧大小为17 of (压缩大小)。这并不严格,但是我从来没有等待过超过30到40秒的时间来等待nrow()命令完成复制。
奖励提示:从第1点开始,在删除组成部分之前,必须调用nrow() (或其他任何方法)来强制执行复制。如果先执行all = rbind(parts),然后执行h2o.rm(parts),然后执行nrow(all),则会得到一个错误(并且您的数据会丢失,需要重新导入)。
https://stackoverflow.com/questions/39430734
复制相似问题