R中的as.h2o()将文件上载到h2o环境需要很长时间

R中的as.h2o()将文件上载到h2o环境需要很长时间,r,h2o,R,H2o,我正在使用h2o进行一些建模,在调整了模型之后,我现在希望它能够用于进行大量预测,大约6万亿次预测/行,每个预测行需要80列数据 我已经将输入数据集分解为大约500 x 1200万个行块,每个行块包含80列相关数据 然而,将一个1200万乘80列的数据表上载到h2o需要相当长的时间,而对我来说,执行500次需要相当长的时间…我认为这是因为它在上载对象之前首先解析对象 相比之下,预测部分相对较快 有没有加快这一部分的建议?改变内核的数量会有帮助吗 下面是一个可复制的问题示例 # Load li

我正在使用h2o进行一些建模,在调整了模型之后,我现在希望它能够用于进行大量预测,大约6万亿次预测/行,每个预测行需要80列数据

我已经将输入数据集分解为大约500 x 1200万个行块,每个行块包含80列相关数据

然而,将一个1200万乘80列的
数据表
上载到h2o需要相当长的时间,而对我来说,执行500次需要相当长的时间…我认为这是因为它在上载对象之前首先解析对象

相比之下,预测部分相对较快

有没有加快这一部分的建议?改变内核的数量会有帮助吗

下面是一个可复制的问题示例

  # Load libraries
  library(h2o)
  library(data.table)

  # start up h2o using all cores...
  localH2O = h2o.init(nthreads=-1,max_mem_size="16g")

  # create a test input dataset
  temp <- CJ(v1=seq(20),
             v2=seq(7),
             v3=seq(24),
             v4=seq(60),
             v5=seq(60))
  temp <- do.call(cbind,lapply(seq(16),function(y){temp}))
  colnames(temp) <- paste0('v',seq(80))

  # this is the part that takes a long time!!
  system.time(tmp.obj <- as.h2o(localH2O,temp,key='test_input'))

  #|======================================================================| 100%
  #   user  system elapsed 
  #357.355   6.751 391.048 
#加载库
图书馆(h2o)
库(数据表)
#使用所有堆芯启动h2o。。。
localH2O=h2o.init(nthreads=-1,max\u mem\u size=“16g”)
#创建测试输入数据集

由于您在本地运行H2O,因此希望将该数据保存为文件,然后使用:

h2o.importFile(localH2O, file_path, key='test_intput')
这将使每个线程并行地读取文件的各个部分。如果在单独的服务器上运行H2O,则需要将数据复制到服务器可以读取的位置(大多数人不会将服务器设置为从笔记本电脑上的文件系统读取)

as.h2o()
将文件连续上载到h2o。使用
h2o.importFile()
,h2o服务器会找到文件并并行读取


看起来您正在使用H2O的版本2。同样的命令也可以在H2Ov3中使用,但是一些参数名称有一些变化。新的参数名称如下:

在解决了这个问题后,我做了一些测试,发现对于R内存中的对象(即,您没有足够的空间以.csv或.txt格式提供它们),加载它们是迄今为止最快的方式(~21 x)是使用in data.table将csv写入磁盘并使用h2o.importFile读取

我尝试了四种方法:

  • as.h2o()的直接使用
  • 使用write.csv()写入磁盘,然后使用h2o.importFile()加载
  • 将数据一分为二,在每一半上以.h2o()的形式运行,然后使用h2o.rbind()进行组合
  • 从data.table使用fwrite()写入磁盘,然后使用h2o.importFile()加载
  • 我在不同大小的data.frame上进行了测试,结果看起来非常清楚

    如果有人对复制感兴趣,代码如下

    library(h2o)
    library(data.table)
    h2o.init()
    
    testdf <-as.data.frame(matrix(nrow=4000000,ncol=100))
    testdf[1:1000000,] <-1000       # R won't let me assign the whole thing at once
    testdf[1000001:2000000,] <-1000
    testdf[2000001:3000000,] <-1000
    testdf[3000001:4000000,] <-1000
    
    resultsdf <-as.data.frame(matrix(nrow=20,ncol=5))
    names(resultsdf) <-c("subset","method 1 time","method 2 time","method 3 time","method 4 time")
    for(i in 1:20){
        subdf <- testdf[1:(200000*i),]
        resultsdf[i,1] <-100000*i
        
        # 1: use as.h2o()
        
        start <-Sys.time()
        as.h2o(subdf)
        stop <-Sys.time()
        resultsdf[i,2] <-as.numeric(stop)-as.numeric(start)
        
        # 2: use write.csv then h2o.importFile() 
    
        start <-Sys.time()
        write.csv(subdf,"hundredsandthousands.csv",row.names=FALSE)
        h2o.importFile("hundredsandthousands.csv")
        stop <-Sys.time()
        resultsdf[i,3] <-as.numeric(stop)-as.numeric(start)
    
        # 3: Split dataset in half, load both halves, then merge
    
        start <-Sys.time()
        length_subdf <-dim(subdf)[1]
        h2o1 <-as.h2o(subdf[1:(length_subdf/2),])
        h2o2 <-as.h2o(subdf[(1+length_subdf/2):length_subdf,])
        h2o.rbind(h2o1,h2o2)
        stop <-Sys.time()
        resultsdf[i,4] <- as.numeric(stop)-as.numeric(start)
        
        # 4: use fwrite then h2o.importfile()
    
        start <-Sys.time()
        fwrite(subdf,file="hundredsandthousands.csv",row.names=FALSE)
        h2o.importFile("hundredsandthousands.csv")
        stop <-Sys.time()
        resultsdf[i,5] <-as.numeric(stop)-as.numeric(start)
    
        plot(resultsdf[,1],resultsdf[,2],xlim=c(0,4000000),ylim=c(0,900),xlab="rows",ylab="time/s",main="Scaling of different methods of h2o frame loading")
        for (i in 1:3){
            points(resultsdf[,1],resultsdf[,(i+2)],col=i+1)
            }
        legendtext <-c("as.h2o","write.csv then h2o.importFile","Split in half, as.h2o and rbind","fwrite then h2o.importFile")
        legend("topleft",legend=legendtext,col=c(1,2,3,4),pch=1)
    
        print(resultsdf)
        flush.console()
        }
        
    
    库(h2o)
    库(数据表)
    h2o.init()
    
    考虑接受提供的答案