如何快速将数据导入h2o

时间:2018-04-03 16:06:08

标签: r import sqlite h2o

我的问题不是:

硬件/空间:

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

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

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

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

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

我尝试了什么:

  • 在'h2o.init'
  • 中将ram撞击高达128 GB
  • 使用slam,data.table和options(...
  • 在“as.h2o”
  • 之前转换为“as.data.frame”
  • 写入csv文件(r write.csv chokes并且需要永远。虽然我写了很多GB,但我明白了。)
  • 写入sqlite3,表的列数太多,这很奇怪。
  • 检查驱动器缓存/交换以确保那里有足够的GB。也许java正在使用缓存。 (仍在工作)

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

UPDATE2:
它是一个可怕的csv文件,大约22GB(~2.4Mrows,~2300 cols)。对于它的价值,从下午12:53到下午2:44花了很多时间来编写csv文件。在写完之后,导入它的速度要快得多。

1 个答案:

答案 0 :(得分:5)

as.h2o()视为便利功能,执行以下步骤:

  1. 将您的R数据转换为data.frame(如果还不是)。
  2. 将data.frame保存到本地磁盘上的临时文件中(如果可用,则使用data.table::fwrite()(*),否则使用write.csv()
  3. 在该临时文件上调用h2o.uploadFile()
  4. 删除临时文件
  5. 正如您的更新所说,将大量数据文件写入磁盘可能需要一段时间。但另一个痛点是使用h2o.uploadFile()而不是更快h2o.importFile()。决定使用的是可见性:

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

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

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

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