如何快速将数据导入h2o

7

我的问题并不是:

硬件 / 空间:

  • 32 个 Xeon 线程,配备 ~256 GB RAM
  • 大约有65 GB 的数据要上传。(约 56 亿个单元格)

问题:
将数据上传到 h2o 中需要数小时。这并不是任何特殊处理,只是使用 "as.h2o(...)"。

使用 "fread" 将文本放入空间只需不到一分钟,然后进行一些行/列转换(diff's, lags),然后尝试导入。

在尝试任何形式的 "as.h2o" 之前,总 R 内存为 ~56GB,因此分配的 128GB 不应该太疯狂,对吧?

问题:
我该怎么做才能使上传到 h2o 的时间少于一个小时?应该只需要一分钟到几分钟的时间。

我尝试过的:

  • 将 "h2o.init" 中的 RAM 提高到 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(约 240 万行,约 2300 列)。就它的价值而言,写入 csv 文件从下午12:53到下午2:44花费了相当长的时间。导入速度要快得多,在写入后。

1个回答

6
as.h2o()视为一个方便函数,它执行以下步骤:
  1. 将您的R数据转换为数据框(如果尚未转换)。
  2. 将该数据框保存到本地磁盘上的临时文件中(如果可用,则使用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中后使用h2o.cbind()将它们合并。
*: 使用h2o:::as.h2o.data.frame(不包括括号)以查看实际代码。对于data.table写入,您需要首先执行options(h2o.use.data.table = TRUE); 您还可以使用h2o.fwrite选项选择开启或关闭它。

@Darren_Cook - 想象一下,在“my_lags”有140个元素且初始df有大约20列,其中16列用于“cols”的情况下,运行此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]”。如果我在h2o中一次一个地做,那将花费我2280行左右的代码量。我可以让R将代码写入文本文件,然后进行源处理,但这比上面的4行更麻烦。 - EngrStudent
1
“as.h2o” 使用 “data.table::fwrite” 是 不正确的。软件包逻辑中的一个错误意味着您还必须设置 options(h2o.use.data.table = TRUE) - Hugh
1
@Hugh 谢谢:我刚刚将其添加到答案中了。 - Darren Cook
1
@EngrStudent 是的:如果H2O内置支持进行滞后处理,那将是非常好的! - Darren Cook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接