Mémoire alternative efficace à rbind en place rbind?
J'ai besoin de rbind deux grandes trames de données. Maintenant j'utilise
df <- rbind(df, df.extension)
mais j'ai (presque) instantanément à court de mémoire. Je suppose que c'est parce que df est tenu à la mémoire de deux fois. Je pourrais voir encore plus grand des trames de données à l'avenir, j'ai donc besoin d'une sorte de place rbind.
Donc ma question est: Est-il un moyen d'éviter la duplication des données dans la mémoire lors de l'utilisation de rbind?
J'ai trouvé ce question, qui utilise SqlLite, mais je veux vraiment éviter d'utiliser le disque dur comme mémoire cache.
- êtes-vous payer? Si oui, pouvez-vous acheter pour moi aussi? 😉
- Si je travaillais pour moi il serait payer pour lui-même dans l'augmentation de la productivité, et quand j'ai posé cet argument à mon employeur actuel, il a été accepté comme un "business case".
- Deux questions: 1: j'ai appris que (re)codage de temps nécessite un TARDIS. 2: au-Delà d'un particulier sweet spot, c'est mieux pour la mémoire de la carte que pour obtenir plus de RAM. Souvent, la fonction objectif pour le CHP est multidimensionnelle.
- Dites-nous les dimensions des deux dfs. Semble comme
object.size(df) >> object.size(df.extension)
, droit? Aussi, pouvons-nous supposer que leurs deux colonnes sont identiques en nombre, le nom, le type, le taux de facteur? donc, nous n'avons pas besoin de vérifier, remplissez les colonnes manquantes, NAs etc?
Vous devez vous connecter pour publier un commentaire.
data.table
est votre ami!C. f. http://www.mail-archive.com/[email protected]/msg175877.html
Suivi nikola commentaire, voici
?rbindlist
's description (nouveau dans v1.8.2) :data.table
a larbindlist
fonction, qui sera utile.dplyr
's rbind_all est un peu plus lent, mais ne à la colonne de vérification de nom, donc parfois, il peut être plus utile.Tout d'abord : l'Utilisation de la solution de l'autre question, vous avez le lien si vous voulez être en sécurité. Comme R est en appel par valeur, oublier "en place", méthode qui n'a pas de copie de votre dataframes dans la mémoire.
Un pas conseillé méthode d'économiser un peu de mémoire, est de prétendre votre dataframes sont des listes, le fait de contraindre une liste à l'aide d'une boucle for (apply (appliquer) pour consommer de la mémoire comme l'enfer) et de faire R crois que c'est en réalité un dataframe.
Je vais vous avertir de nouveau : l'utilisation de cette plus complexes dataframes est d'avoir des ennuis et dur-à-trouver des bugs. Assurez-vous donc de tester assez bien, et si possible, évitez autant que possible.
Vous pouvez essayer de l'approche suivante :
Il efface rownames vous aviez en fait (vous pouvez les reconstruire, mais la vérification des doublons rownames!). Il également ne pas s'acquitter de tous les autres tests inclus dans rbind.
Vous permet d'économiser environ la moitié de la mémoire, dans mes tests, et dans mon test à la fois la dtfcomb et la dtf sont égaux. La zone rouge est rbind, le jaune, ma liste est basée sur l'approche.
Script de Test :
Maintenant j'ai la solution suivante:
Maintenant, je n'ai pas de manquer de mémoire. Je pense que c'est parce que j'magasin
tout avec rbind R aurait besoin
Après que j'utilise
pour libérer de la mémoire, je n'ai pas besoin de plus.
Cela a résolu mon problème pour l'instant, mais j'ai l'impression qu'il est plus avancé moyen de faire un mémoire efficace rbind. J'apprécie tous les commentaires sur cette solution.
object.size(df) >> object.size(df.extension)
, droit?rbind
data.table::rbind_all
par Ari Friedman réponseC'est un candidat parfait pour
bigmemory
. Voir le site pour plus d'informations. Voici trois de l'utilisation des aspects à considérer:separated = TRUE
pour rendre les colonnes distinctes. Je n'ai pas utilisé beaucoup, parce que de mon 3ème astuce:rbind
.Remarque: Bien que l'original question des trames de données et bigmemory est adapté pour les matrices, on peut facilement créer des matrices différentes pour les différents types de données, puis de combiner les objets en mémoire vive pour créer un dataframe, si c'est vraiment nécessaire.
bigmatrix
, comme je l'ai généralement de la poignée de la stratification sur mon propre. J'ai eu facteurs mutilé trop souvent par d'autres R code pour utiliser vraiment, de toute façon. Pour ces données, j'ai presque toujours coller avec des nombres entiers et utiliser des noms de variable pour indiquer le type. Si quelque chose poignées de facteurs de façon responsable, je fais une conversion avant de transmettre les données.ggplot
, mais la plupart de mes objets de données sont de petites listes et des matrices de grande taille.