2017-08-20 8 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がわからないため、質問には答えられません。しかし、私は推測することができます。

data.tableを記入するコードは、「コピーオン時変更」の意味があるために遅いです。参照によってテーブルを更新すると、コードを大幅に高速化できます。 set私のループで

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

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

あなたのループが18秒(6000倍)をとりながら、3ミリ秒かかります。

私は同じ方法で動作すると思いますが、これは特殊なオブジェクトであるため、いくつかの追加作業が必要です。 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にデータを読み込むための最速の方法は)h2o.importFile(プル方式を使用して、それを摂取することです。これは並行して配布されます。

上記のas.h2o()トリックは、1つのホストのメモリに簡単に収まる小さなデータセットでうまく機能します。

RとH2Oの間のネットワークメッセージを見たい場合は、h2o.startLogging()を呼び出します。