H2O的运行速度比data.table R慢

时间:2017-08-20 14:12:42

标签: r data.table h2o

如何将数据存储到H2O矩阵中的速度比data.table要慢?

#Packages used "H2O" and "data.table"
library(h2o)
library(data.table)
#create the matrix
matrix1<-data.table(matrix(rnorm(1000*1000),ncol=1000,nrow=1000))
matrix2<-h2o.createFrame(1000,1000)

h2o.init(nthreads=-1)
#Data.table variable store
for(i in 1:1000){
matrix1[i,1]<-3
}
#H2O Matrix Frame store
for(i in 1:1000){
  matrix2[i,1]<-3
}

谢谢!

2 个答案:

答案 0 :(得分:4)

H2O是一种客户端/服务器架构。 (见http://docs.h2o.ai/h2o/latest-stable/h2o-docs/architecture.html

所以你所展示的是在H2O内存中指定H2O帧的效率非常低的方法。每次写入都将变成网络呼叫。你几乎肯定不想要这个。

对于您的示例,由于数据不大,合理的做法是对本地数据框(或数据表)进行初始分配,然后使用as.h2o()的push方法。

h2o_frame = as.h2o(matrix1)
head(h2o_frame)

这将R数据帧从R客户端推送到H2O服务器内存中的H2O帧。 (你可以做as.data.table()来做相反的事情。)

data.table提示:

对于data.table,更喜欢in-place:=语法。这避免了副本。所以,例如:

matrix1[i, 3 := 42]

H2O提示:

将数据读入H2O的最快方法是使用h2o.importFile()中的pull方法摄取数据。这是平行的和分布式的。

上面显示的as.h2o()技巧适用于容易适合一个主机内存的小型数据集。

如果要观看R和H2O之间的网络消息,请调用h2o.startLogging()。

答案 1 :(得分:2)

我无法回答你的问题,因为我不知道h20。不过我可以猜一猜。

您填写data.table的代码很慢,因为&#34; copy-on-modify&#34;语义。如果您通过引用更新表格,那么您将非常快速地加速代码。

for(i in 1:1000){ 
  matrix1[i,1]<-3 
}

for(i in 1:1000){ 
  set(matrix1, i, 1L, 3) 
}

使用set我的循环需要3毫秒,而你的循环需要18秒(6000倍以上)。

我认为h2o以相同的方式工作,但需要完成一些额外的工作,因为这是一个特殊的对象。也许有些消息传递给H2O集群?