2017-08-20 80 views
1

如何將數據存儲到H2O矩陣中比data.table慢?H2O運行比data.table慢R

#Packages used "H2O" and "data.table" 
library(h2o) 
library(data.table) 
#create the matrix 
matrix1<-data.table(matrix(rnorm(1000*1000),ncol=1000,nrow=1000)) 
matrix2<-h2o.createFrame(1000,1000) 

h2o.init(nthreads=-1) 
#Data.table variable store 
for(i in 1:1000){ 
matrix1[i,1]<-3 
} 
#H2O Matrix Frame store 
for(i in 1:1000){ 
    matrix2[i,1]<-3 
} 

謝謝!

+0

請指定您正在使用的軟件包。 –

+0

我正在使用h2o和data.table包 – Jesus

+0

如果以下答案有幫助,請考慮接受它。謝謝! – TomKraljevic

回答

2

我無法回答你的問題,因爲我不知道h20。不過,我可以猜測。

由於「copy-on-modify」語義,您填寫data.table的代碼很慢。如果你通過引用來更新你的表格,你會非常快的加速你的代碼。

for(i in 1:1000){ 
    matrix1[i,1]<-3 
} 

for(i in 1:1000){ 
    set(matrix1, i, 1L, 3) 
} 

隨着set我的循環需要3毫秒,而你的循環需要18秒(6000次以上)。

我想h2o以同樣的方式工作,但有一些額外的東西完成,因爲這是一個特殊的對象。也許有些消息傳遞給H2O集羣?

+0

如果我想填充所有的列而不是簡單的行[i] ??我怎樣才能使用set(matrix1,i,1L,3)? – Jesus

+1

雙循環?那麼,實際上,如果你想填充你的表格,你最好在創建時填充它,而不是在循環中創建。這不是R的方式。 – JRR

+0

想象我想爲矩陣的列指定另一個df的值,這是實現它的最佳方法? – Jesus

3

H2O是客戶機/服務器體系結構。 (見http://docs.h2o.ai/h2o/latest-stable/h2o-docs/architecture.html

所以你已經展示了一種非常低效的方式來指定H2O記憶中的H2O框架。每一個寫作都將變成網絡電話。你幾乎肯定不想要這個。

對於您的示例,由於數據量不大,因此合理的做法是對本地數據框(或數據表)執行初始分配,然後使用as.h2o()的push方法。

h2o_frame = as.h2o(matrix1) 
head(h2o_frame) 

這會將來自R客戶端的R數據幀推送到H2O服務器內存中的H2O框架中。 (你可以做as.data.table()做相反。)


data.table提示:

對於data.table,喜歡就地:=語法。這避免了副本。因此,舉例來說:

matrix1[i, 3 := 42] 

H2O提示:

將數據讀入水最快的方法是通過拉法h2o.importFile攝取它()。這是平行和分佈的。

上面顯示的as.h2o()技巧適用於容易適合一臺主機的內存的小數據集。

如果要觀看R和H2O之間的網絡消息,請調用h2o.startLogging()。