首页 文章

如何快速将数据导入h2o

提问于
浏览
6

我的问题不是:

硬件/空间:

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

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

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

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

Question:
我该怎么做才能让这个加载到h2o不到一个小时?它应该需要一分钟到几分钟,不再需要 .

What I have tried:

  • 在'h2o.init'中撞击高达128 GB的ram

  • 使用slam,data.table和options(...

  • 转换为"as.data.frame"之前"as.h2o"

  • 写入csv文件(r write.csv chokes并且需要永远 . 虽然我写了很多GB,所以我理解) .

  • 写入sqlite3,表的列太多了,这很奇怪 .

  • 检查驱动器缓存/交换以确保那里有足够的GB . 也许java正在使用缓存 . (还在工作)

Update:
所以看起来我唯一的选择是创建一个巨大的文本文件,然后使用"h2o.importFile(...)" . 我写了15GB .

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

1 回答

  • 5

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

    • 将您的R数据转换为data.frame(如果还没有) .

    • 将data.frame保存到本地磁盘上的临时文件(如果可用,则使用 data.table::fwrite() (*),否则使用 write.csv()

    • 在该临时文件上调用 h2o.uploadFile()

    • 删除临时文件

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

    • 使用 h2o.uploadFile() ,您的客户必须能够查看该文件 .

    • 使用 h2o.importFile() ,您的群集必须能够查看该文件 .

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

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

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

相关问题