6
votes

Chargement / lecture des données dans R prise trop de mémoire

J'utilise R pour une analyse de données. Spécifications du système: RAM I5 + 4GB. Pour une raison quelconque, ma session R est beaucoup plus grande que mes données qui me laisse très peu d'espace pour d'autres opérations.

J'ai lu un fichier 550 Mo de CSV , mémoire prise par R: 1.3 - 1,5 Go J'ai sauvegardé le CSV en tant que fichier .rdata. Taille du fichier: 183MB . Chargé le fichier dans R, mémoire prise par R: 780MB . Une idée de la raison pour laquelle cela pourrait se produire et comment le réparer?

Edits: Le fichier comporte 123 colonnes et 1190387 rangées. Les variables sont de type num et int .

r

5 commentaires

Sans exemple reproductible, il est difficile de commenter cette


Cela vous aiderait si vous nous diriez combien de lignes et de colonnes que vous avez, et quelle classe (caractère, numérique, entier, facteur?) Chaque colonne est. Ajouter peut-être les résultats de str (my_data_frame) à votre question. Voici une supposion sauvage: essayez d'ajouter stringsasfactors = false à votre read.table () appel.


@BDemarest Le fichier comporte 123 colonnes et 1190387 rangées. Les variables sont de type NUM et INT. J'ai ajouté stringsasfactors = false à mon lis.csv () appeler mais il n'a pas fait la différence dans l'utilisation de la mémoire.


Je dois crucialement, vous devez nous dire: votre Version RStudio , votre R Version et votre Version OS (MacOS? 10.6 / .7 / .8 /.8.5/.9 ...?) En outre, essayez de mettre à niveau sur les versions actuelles R et ensuite RStudio, puis dites-nous les numéros de mémoire que vous voyez à la fois pour Standalone R et RStudio.


Si ce problème est résolu par les dernières versions R et RStudio, puis fermez-la (avec une note sur laquelle les versions).


4 Réponses :


6
votes

r utilise plus de mémoire probablement en raison de la copie d'objets. Bien que ces copies temporaires soient supprimées, r occupe toujours l'espace. Pour remettre cette mémoire au système d'exploitation, vous pouvez appeler la fonction gc . Cependant, lorsque la mémoire est nécessaire, gc est appelé automatiquement.

En outre, il n'est pas évident qu'une carte de 550 Mo de fichier CSV à 550 Mo dans R. Cela dépend des types de données des colonnes (flotteur, int, caractère), qui utilisent toutes des quantités différentes de mémoire.

Le fait que votre fichier rdata est plus petit n'est pas étrange que R compresse les données, voir la documentation de Enregistrer .


2 commentaires

Je suppose que la seule façon de sauvegarder la mémoire consiste à stocker les données dans une base de données SQLite et n'appelle que quelques colonnes à la fois. gc n'a pas vraiment aidé. C'est ce que j'ai eu quand j'ai utilisé la fonction de fonction - (verbose = getOption ("verbose"), réinitialiser = false = false) {res <- .Internal (gc (verbose, réinitialisation)) Res <- MATRIX (RES, 2L, 7L, DimNames = liste (C ("NCells", "vCells"), C ("utilisé", "(MB)", "Trigger GC", "(MB)", "Limite", " Max utilisé "," (MB) ")))) Si (Tout (is.na (res [ 5l]))) res [ -5l] sinon res} < / code>


Essayez d'utiliser gc () , pas gc . Taper une fonction sans les parenthèses conduit à R montrant le code source R d'une fonction.



18
votes

Une valeur numérique (point flottant à double précision) est stocké dans 8 octets de RAM.
Une valeur entière (dans ce cas) utilise 4 octets.
Vos données ont 1 0,190 387 * 123 = 146,417 601.
Si toutes les colonnes sont numériques, 1 171 340 808 octets de RAM utilisées (~ 1,09 Go).
Si tous sont entier, 585 670 404 octets sont nécessaires (~ 558 Mo).

Il est donc parfaitement logique que vos données utilisent 780 Mo de RAM.

Conseil très général:

  1. Convertissez vos données.frame en matrice. Les opérations matricielles ont souvent moins de frais généraux.
  2. Essayez r Package BIGMemory: http://cran.r-project.org/web/ Forfaits / BigMemory / Index.html
  3. Achetez plus de RAM. Peut-être que votre machine peut supporter jusqu'à 16 Go.
  4. Ne chargez pas toutes vos données dans la RAM en même temps. Charger des sous-ensembles de lignes ou de colonnes, analyser, enregistrer des résultats, répéter.
  5. Utilisez un très petit jeu de données de test pour concevoir votre analyse, puis analyser le jeu de données complet sur une autre machine / serveur avec plus de mémoire.

0 commentaires

0
votes

(chevauchement certains avec les commentaires précédents)

Vous pouvez utiliser Read_CSV ou Read_Table à partir du package Readr, ce qui permet de charger des données plus rapidement.

Utilisez gc () et mem_change () pour vérifier la modification de la mémoire et identifier quelle étape conduit à l'augmentation de la mémoire.

Vous pouvez certainement construire une connexion et lire des données par des morceaux.

ou créer une base de données, puis utilisez RPOSTGRESQL; Rsqlite; Rmysql. Vérifiez dbConnect, dbwritettable, dbgequery.

Il est difficile de dire plus sans exemple de reproduction.


0 commentaires

1
votes

Je suppose que vous utilisez read.csv () basé sur lecture.table () . .

Le problème avec ces fonctions est qu'ils fragmentent la mémoire horriblement. Et puisque le collecteur de poubelles R ne peut pas déplacer de l'espace alloué à la mémoire libre des parties fragmentées (un court-circuit du collecteur de poubages R), vous êtes bloqué avec la solution que vous choisissez:

  • Lisez les données via Read.table.
  • sauvegardez-le via sauvegarder () .
  • tuer R.
  • Chargez les données via charge () .

0 commentaires