【问题标题】:H2O running slower than data.table RH2O 运行速度比 data.table R 慢
【发布时间】:2017-08-20 14:12:42
【问题描述】:

如何将数据存储到 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 包
  • 如果下面的回答有帮助,请考虑采纳。谢谢!

标签: r data.table h2o


【解决方案1】:

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,更喜欢就地 := 语法。这样可以避免复制。所以,例如:

matrix1[i, 3 := 42]

H2O 提示:

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

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

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

【讨论】:

    【解决方案2】:

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

    由于“修改时复制”语义,您填充 data.table 的代码很慢。如果您通过引用更新您的表,您将大大加快您的代码。

    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 集群?

    【讨论】:

    • 如果我想填充所有列而不是简单的行 [i],我该如何使用 set(matrix1,i,1L,3)??
    • 双循环?好吧,实际上,如果您想填充表格,最好在创建时而不是在循环创建之后填充它。这不是 R 方式。
    • 想象一下我想为矩阵的一列分配另一个df的值,这是最好的方法吗?
    • matrix[,i] = df$mycol 复制矩阵列 imatrix[,i] = 3 中的整个列 mycol 以获取单个数字。
    • 这不是低效的方式吗?我认为这是一种不好的方法......不可能像 := 或使用 h2o 那样做?谢谢!
    猜你喜欢
    • 2016-11-23
    • 2012-12-25
    • 2019-04-23
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多