作者:小妖 | 来源:互联网 | 2022-12-22 08:36
我的问题不是:
维护h2o数据帧的有效方法
H2O的运行速度比data.table R慢
在h2o中加载大于内存大小的数据
硬件/空间:
32个Xeon线程w/~256 GB Ram
~65 GB的数据上传.(约56亿个细胞)
问题:
将数据上传到h2o需要数小时.这不是任何特殊处理,只有"as.h2o(...)".
使用"fread"将文本放入空间需要不到一分钟,然后我进行一些行/列转换(差异,滞后)并尝试导入.
在尝试任何类型的"as.h2o"之前,总R内存是~56GB,所以分配的128不应该太疯狂,不是吗?
问题:
如果需要不到一个小时加载到h2o,我该怎么办?它应该需要一分钟到几分钟,不再需要.
我尝试过的:
'h2o.init'中撞击高达128 GB的ram
使用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> Darren Cook..:
将其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
.