2 votes

H2O fonctionne plus lentement que data.table R

Comment est-il possible que le stockage des données dans la matrice H2O soit plus lent que dans data.table ?

#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
}

Merci !

4voto

TomKraljevic Points 1817

H2O est une architecture client/serveur. (Voir http://docs.h2o.ai/h2o/latest-stable/h2o-docs/architecture.html )

Ce que vous avez montré est donc un moyen très inefficace de spécifier un cadre H2O dans la mémoire H2O. Chaque écriture va se transformer en un appel réseau. Ce n'est certainement pas ce que vous voulez.

Dans votre exemple, comme les données ne sont pas volumineuses, il serait raisonnable de procéder à l'affectation initiale à un cadre de données local (ou à une table de données), puis d'utiliser la méthode push de as.h2o().

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

Cela pousse un cadre de données R du client R vers un cadre H2O dans la mémoire du serveur H2O. (Et vous pouvez faire as.data.table() pour faire l'inverse).


data.table Tips :

Pour data.table, préférez la syntaxe := en place. Cela évite les copies. Ainsi, par exemple

matrix1[i, 3 := 42]

Conseils H2O :

Le moyen le plus rapide de lire des données dans H2O est de les ingérer à l'aide de la méthode pull dans h2o.importFile(). Cette méthode est parallèle et distribuée.

L'astuce as.h2o() présentée ci-dessus fonctionne bien pour les petits ensembles de données qui tiennent facilement dans la mémoire d'un hôte.

Si vous voulez observer les messages du réseau entre R et H2O, appelez h2o.startLogging().

2voto

JRR Points 1206

Je ne peux pas répondre à votre question parce que je ne sais pas h20 . Cependant, je peux faire une supposition.

Votre code pour remplir le data.table est lent à cause de la sémantique "copy-on-modify". Si vous mettez à jour votre table par référence, vous accélérerez incroyablement votre code.

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

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

Con set ma boucle prend 3 millisec, alors que votre boucle prend 18 sec (6000 fois plus).

Je suppose h2o de fonctionner de la même manière, mais avec quelques trucs supplémentaires, car il s'agit d'un objet spécial. Peut-être une communication par passage de messages vers le cluster H2O ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X