H2O运行速度低于表R中的数据

H2O运行速度低于表R中的数据,r,data.table,h2o,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=

如何可能将数据存储到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
}
#使用“H2O”和“data.table”的包
图书馆(h2o)
库(数据表)
#创建矩阵

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

由于“修改时复制”的语义,用于填充
数据表的代码速度较慢。如果您通过引用更新表,您将难以置信地加快代码的速度

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

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

matrix1[i,1]H2O是一种客户机/服务器体系结构

因此,您所展示的是在H2O内存中指定H2O帧的一种非常低效的方法。每次写入都将变成一个网络调用。您几乎肯定不希望这样

对于您的示例,由于数据并不大,因此合理的做法是对本地数据帧(或datatable)进行初始赋值,然后使用as.h2o()的push方法

这会将R客户机的R数据帧推送到H2O服务器内存中的H2O帧中。(您可以按.data.table()执行相反的操作。)


数据表提示:

对于data.table,首选in-place:=语法。这样可以避免复制。例如:

matrix1[i, 3 := 42]

H2O提示:

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

上面显示的as.h2o()技巧适用于容易放入一台主机内存中的小型数据集


如果您想查看R和H2O之间的网络消息,请调用H2O.StasLogLogg()。请指定您正在使用的包。我正在使用H2O和DATA表包装。如果下面的答案是有用的,请考虑接受它。谢谢!如果我想填充所有列而不是简单行[I],那么如何使用SET(MatRIX1,I,1L,3)??双循环?事实上,如果你想填充表格,最好在创建时填充,而不是在创建后在循环中填充。这不是R方式。想象一下,我想为矩阵的一列指定另一个df的值,这是最好的方式吗?

matrix[,I]=df$mycol
复制矩阵列
i
matrix[,i]=3
中的整个列
matrix1[i, 3 := 42]