如何将数据存储到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
}
谢谢!
答案 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集群?