【问题标题】:How to get data into h2o fast如何快速将数据放入 h2o
【发布时间】:2018-09-13 01:03:18
【问题描述】:

我的问题不是:

硬件/空间:

  • 32 Xeon 线程 w/ ~256 GB Ram
  • ~65 GB 的数据要上传。 (约 56 亿个细胞)

问题:
将我的数据上传到 h2o 需要几个小时。这不是任何特殊处理,只有“as.h2o(...)”。

使用“fread”将文本放入空间只需不到一分钟,然后我进行了一些行/列转换(差异、滞后)并尝试导入。

在尝试任何类型的“as.h2o”之前,总 R 内存约为 56GB,因此分配的 128 应该不会太疯狂,不是吗?

问题:
我该怎么做才能使这个加载到 h2o 中花费不到一个小时?它应该需要一分钟到几分钟,不再。

我尝试过的:

  • 在“h2o.init”中将内存提升到 128 GB
  • 使用 slam、data.table 和 options(...
  • 在“as.h2o”之前转换为“as.data.frame”
  • 写入 csv 文件(r write.csv 会阻塞并需要很长时间。不过它写入了很多 GB,所以我理解)。
  • 写入sqlite3,一个表的列太多,这很奇怪。
  • 检查驱动器缓存/交换以确保那里有足够的 GB。也许java正在使用缓存。 (仍在工作)

更新:
所以看起来我唯一的选择是制作一个巨大的文本文件,然后使用“h2o.importFile(...)”。我最多写了15GB。

更新 2:
这是一个可怕的 csv 文件,大小约为 22GB(~2.4Mrows,~2300 cols)。值得一提的是,从下午 12 点 53 分到下午 2 点 44 分才编写了 csv 文件。编写完成后,导入它的速度要快得多。

【问题讨论】:

    标签: r import sqlite h2o


    【解决方案1】:

    as.h2o() 视为一个便利函数,它执行以下步骤:

    1. 将您的 R 数据转换为 data.frame(如果还没有的话)。
    2. 将该 data.frame 保存到本地磁盘上的临时文件中(如果可用,它将使用 data.table::fwrite() (*),否则使用 write.csv()
    3. 在该临时文件上调用h2o.uploadFile()
    4. 删除临时文件

    正如您的更新所说,将大量数据文件写入磁盘可能需要一段时间。但这里的另一个痛点是使用h2o.uploadFile() 而不是更快的h2o.importFile()。使用哪个决定是可见性:

    • 使用h2o.uploadFile(),您的客户必须能够看到该文件。
    • 使用h2o.importFile(),您的集群必须能够看到该文件。

    当您的客户端与您的集群节点之一在同一台机器上运行时,您的数据文件对客户端和集群都是可见的,因此始终首选h2o.importFile()。 (它执行多线程导入。)

    另外几个提示:只将数据带入您实际需要的 R 会话中。请记住,R 和 H2O 都是面向列的,因此 cbind 可以很快。如果您只需要在 R 中处理 2300 列中的 100 列,请将它们放在一个 csv 文件中,并将其他 2200 列保留在另一个 csv 文件中。然后 h2o.cbind() 将它们加载到 H2O 中。

    *:使用h2o:::as.h2o.data.frame(不带括号)查看实际代码。对于 data.table 的编写,你需要先做options(h2o.use.data.table = TRUE);您还可以选择使用h2o.fwrite 选项打开/关闭它。

    【讨论】:

    • @Darren_Cook - 想象一下操作这个 data.table 代码 "df[, (paste0("lag_",rep(cols, each = length(my_lags)), "_", rep(my_lags, times = length(cols)))) := unlist(lapply(.SD, function(x) shift(x, my_lags, type = "lag")), recursive = F), .SDcols = cols]" when "my_lags"有 140 个元素,如果在“cols”中使用了 16 列,则初始 df 约为 20 列。如果我必须在 h2o 中一次完成一项,我将需要 2280 行代码。我可以让 R 将代码写入一个文本文件,然后获取它,但这比上面的 4 行更令人头疼。
    • as.h2o 使用data.table::fwrite(如果可用)不是是真的。包逻辑中的错误意味着您还必须设置options(h2o.use.data.table = TRUE)
    • @Hugh 谢谢:我刚刚将其添加到答案中。
    • @EngrStudent 是的:如果 H2O 内置了对延迟的支持,那就太好了!
    猜你喜欢
    • 2021-05-06
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2020-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多