【问题标题】:Efficient way to maintain a h2o data frame维护 h2o 数据框的有效方法
【发布时间】:2017-06-21 18:22:05
【问题描述】:

假设我有一个返回数据的函数“getData()”(将其视为数据流)。现在我需要用这些数据形成一个 h2o 数据框。仅当之前的数据框中不存在它们时,我才需要将它们作为新行插入。

一个明显的方法是:

  1. 有一个全局 h2o 数据框
  2. 根据到达的数据创建一个 h2o 数据框(1 行)。 (我正在使用 as.h2o())
  3. 检查它是否已经存在于全局数据框中(使用 h2o.which() 或任何其他函数)
  4. 如果不存在,则将其添加到数据框中(使用 h2o.rbind())

上述解决方案太慢了。每次数据到达(第二步)时创建 h2o 数据帧需要太多时间。 (仅在小数据集上测试)

我还考虑将它们存储在 R 数据框中,然后在一段时间后使用 h2o.rbind()。

最好的(时间是优先的)方法是什么?

【问题讨论】:

  • 这篇文章需要一个代码示例和一些基准测试。你是如何创建 H2O 框架的?创建一个框架应该不会花费太多时间——第 2 步是这里真正的瓶颈。我怀疑添加另一个创建 R data.frame 的步骤会降低速度,但这就是为什么代码和基准测试是真正回答您的问题的唯一方法。
  • @ErinLeDell 我已经编辑了这个问题。在小数据集(大约 500 行增量)上,创建 h2o 数据框似乎比搜索和绑定花费更多时间。
  • 好的,谢谢,现在更有意义了。 getData() 返回什么,R 中的 1 行 data.frame?
  • @ErinLeDell 是的。

标签: r h2o


【解决方案1】:

您肯定希望尽可能减少对as.h2o() 的调用,因为该函数实际上将数据从 R 内存写入磁盘,然后将数据从磁盘读取到 H2O 集群。它意味着要谨慎使用。但是,加快as.h2o() 调用的一种方法是在后端使用data.table。如果您安装了 data.table,则可以将以下行添加到代码的顶部,它将使用 data.table::fwrite() 而不是 as.h2o() 内的 utils::write.csv()

library(data.table)
options("h2o.use.data.table" = TRUE)

由于您想尽量减少对as.h2o() 的调用,因此在 R data.frame 中存储几百或几千行然后使用 as.h2o() 定期将该 data.frame 转换为 H2OFrame 可能会更快(使用data.table 后端),然后扫描 H2OFrame 的行以查看哪些是新的,然后使用 h2o.rbind() 将它们添加到您的“全局”H2OFrame。

确定哪种方法更快的唯一方法是在您的数据和机器上测试这两种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多