Comment faire pour accélérer rbind?
Je suis censé pour télécharger un tableau à partir de MS-SQL server.
Le nombre de ligne est de plus de 6 millions d'. Le serveur ne peut pas revenir ensemble de données à la fois.
Alors, j'ai écrit un code qui télécharge 10 000 lignes à la fois. et, il lie des lignes de la boucle.
Supposer que getData()
fonction renvoie un bloc de données contient 10000 lignes à la fois. (Pseudo-Code)
for(i in 1:600)
{
tempValue <- getData()
wannagetValue <- rbind(wannagetValue,tempValue)
print(i)
}
Le problème est qu'il devient plus lent que le temps passe.
Je pense que l'utilisation rbind de cette manière n'est pas une bonne idée.
Tous les conseils seront très utiles. Je vous remercie à l'avance.
Si vous connaissez la taille de votre éventuel bloc de données va être alors il sera beaucoup plus rapide à pré-allouer et remplissez les valeurs que vous allez. Bien qu'il existe probablement une solution plus rapide à l'aide de différentes structures de données que quelqu'un post.
wannagetValue <- rbind(wannagetValue,getData()); . Qui pourrait accélérer un peu votre code...mais la question principale est de savoir, pourquoi autant de données?
Merci David! Vous m'avez sauvé.. Robert // je n'ai aucune idée~~ tout ce que je sais est qu'il y a de données de plus de 500 GO taille.
Vous faire réaliser que R stocke tout dans la mémoire, à droite? Si vous avez 500 GO de données, vous aurez besoin d'au moins autant de RAM, et idéalement deux fois plus.
Ensemble de données brutes dépassent 500 GO, mais il sera de 5~10 GO totla si elle stocke sous forme de données binaires. En outre, Chaque table contient 1~2 GO. Je peux le traiter séparément. Heureusement, mon ordinateur a 64 GO de mémoire DDR3 ECC RAM. Je ne pense pas que c'est pas assez. En passant, merci pour les conseils.
wannagetValue <- rbind(wannagetValue,getData()); . Qui pourrait accélérer un peu votre code...mais la question principale est de savoir, pourquoi autant de données?
Merci David! Vous m'avez sauvé.. Robert // je n'ai aucune idée~~ tout ce que je sais est qu'il y a de données de plus de 500 GO taille.
Vous faire réaliser que R stocke tout dans la mémoire, à droite? Si vous avez 500 GO de données, vous aurez besoin d'au moins autant de RAM, et idéalement deux fois plus.
Ensemble de données brutes dépassent 500 GO, mais il sera de 5~10 GO totla si elle stocke sous forme de données binaires. En outre, Chaque table contient 1~2 GO. Je peux le traiter séparément. Heureusement, mon ordinateur a 64 GO de mémoire DDR3 ECC RAM. Je ne pense pas que c'est pas assez. En passant, merci pour les conseils.
OriginalL'auteur Keith Park | 2013-10-31
Vous devez vous connecter pour publier un commentaire.
Voici quelques options que je suis sûr que pourrait être mieux:
Comme vous pouvez le voir à l'aide de
data.table
'srbindlist()
est une grande amélioration par rapport à la base de la Rrbind()
et il y a un grand avantage à ajouter les lignes à la fois au lieu de l'interaction, mais cela peut ne pas être possible si il y a des soucis de mémoire. Vous pouvez aussi noter que l'amélioration de la vitesse ne sont nulle part près linéaire en la taille des données augmente.do.call(rbind, lapply(1:25,function(...) getData()))
Bonne idée, merci.
Merci beaucoup pour les informations détaillées.~ cela m'aide beaucoup.
OriginalL'auteur David
Comme il a été souligné ci-dessus, R stocke tous ses objets dans la mémoire RAM par défaut, donc avec cette quantité de données, vous allez rencontrer quelques problèmes.
Deux choses que j'aimerais ajouter:
1) en règle générale, si vous ne voulez pas utiliser de données.table, vous pouvez utiliser le
rbind.fill
fonction de Hadley estplyr
paquet, ce qui est assez rapide, trop. Jamais utilisationrbind
la façon dont vous l'avez fait ci-dessus, en un "pour" en boucle, en ajoutant chaque ligne séparément. C'forces R pour faire une copie de la trame de données de l'objet à chaque fois que vous ajoutez une ligne, et c'est lent.2) travailler avec le plus-que-RAM de données avec R, jetez un oeil à la section Grande capacité de mémoire et de capacité de mémoire de données à http://cran.r-project.org/web/views/HighPerformanceComputing.html, peut-être le
bigmemory
emballage est ce que vous avez besoin.Cette question est un peu vieux, mais j'ai toujours trouvé ça en cherchant une solution aujourd'hui, je tiens à ajouter que Hadley, la plus récente de l'
dplyr
paquet a la fonctionbind_rows
qui est analogue àrbind.fill
. Je comparés et il fonctionne sur 1000x plus rapide quedo.call('rbind', ...)
sur ma machine. Voir cette question.OriginalL'auteur coanil
Peut-être que vous pourriez faire
SELECT COUNT(*) FROM table_name WHERE ...
et puis préallouer de l'espace pour votre bloc de données.En fait, je ne pense pas que l'interrogation de la base de données par 10k lignes est une bonne idée. Essayez d'éviter que par l'exportation des données vers un disque local et de les lire à partir de là. Il permettra d'améliorer la vitesse. Le stockage n'est pas cher, la bande passante du réseau et de la mémoire ne sont pas.
OriginalL'auteur Kendrick Fong