web-dev-qa-db-fra.com

R gestion de la mémoire / impossible d’allouer un vecteur de taille n Mo

Je rencontre des problèmes en essayant d'utiliser des objets volumineux dans R. Par exemple:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

Je comprends que cela est lié à la difficulté d’obtenir des blocs de mémoire contigus (de ici ):

Les messages d'erreur débutants ne peuvent pas allouer de vecteur de taille indiquent un échec lors de l'obtention de la mémoire, soit parce que la taille dépasse la limite d'espace adresse pour un processus, ou plus vraisemblablement, parce que le système n'a pas pu fournir la mémoire. Notez que sur une version 32 bits, il peut bien y avoir suffisamment de mémoire disponible, mais pas assez de bloc d'espace d'adressage contigu suffisamment grand pour la mapper.

Comment puis-je contourner cela? Ma principale difficulté est que j'arrive à un certain point dans mon script et que R ne peut pas allouer 200-300 Mo pour un objet ... Je ne peux pas vraiment pré-allouer le bloc car j'ai besoin de mémoire pour un autre traitement. Cela se produit même lorsque je supprime avec diligence des objets inutiles.

EDIT: Oui, désolé: Windows XP SP3, 4 Go de RAM, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
127
Benjamin

Déterminez si vous avez vraiment besoin de toutes ces données de manière explicite ou si la matrice peut être rare. Il existe un bon support dans R (voir le package Matrix pour plus d'informations, par exemple) pour les matrices creuses.

Conservez tous les autres processus et objets dans R au minimum lorsque vous devez créer des objets de cette taille. Utilisez gc() pour effacer maintenant la mémoire inutilisée, ou mieux créez uniquement l'objet dont vous avez besoin en une session.

Si les solutions ci-dessus ne vous aident pas, procurez-vous un ordinateur 64 bits avec autant de RAM que vous pouvez vous le permettre et installez la version R.x 64 bits.

Si vous ne pouvez pas faire cela, il existe de nombreux services en ligne pour l'informatique à distance.

Si vous ne pouvez pas faire cela, les outils de mappage de la mémoire tels que le package ff (ou bigmemory comme Sascha le mentionne) vous aideront à créer une nouvelle solution. Dans mon expérience limitée, ff est le package le plus avancé, mais vous devriez lire la rubrique High Performance Computing sur les vues de tâches CRAN.

67
mdsumner

Pour les utilisateurs de Windows, les éléments suivants m'ont beaucoup aidé à comprendre certaines limitations de mémoire:

  • avant d'ouvrir R, ouvrez le Moniteur de ressources Windows (Ctrl-Alt-Suppr/Démarrer le gestionnaire de tâches/onglet Performances/cliquez sur le bouton inférieur "Moniteur de ressources"/onglet Mémoire).
  • vous verrez combien de mémoire RAM nous déjà déjà utilisées avant d’ouvrir R et par quelles applications. Dans mon cas, 1,6 Go sur un total de 4 Go sont utilisés. Donc, je ne pourrai obtenir que 2,4 Go pour R, mais maintenant vient le pire ...
  • ouvrez R et créez un ensemble de données de 1,5 Go, puis réduisez sa taille à 0,5 Go. Le moniteur de ressources indique que ma RAM est utilisée à près de 95%.
  • tilisez gc() pour faire la récupération de place => ça marche, je peux voir que l'utilisation de la mémoire est réduite à 2 Go

enter image description here

Conseils supplémentaires qui fonctionnent sur ma machine:

  • préparez les fonctions, enregistrez-les sous forme de fichier RData, fermez R, rouvrez R et chargez les caractéristiques du train. Le gestionnaire de ressources affiche généralement une utilisation réduite de la mémoire, ce qui signifie que même gc () ne récupère pas toute la mémoire possible et fermer/réouvrir R fonctionne de manière optimale pour démarrer avec la mémoire maximale disponible.
  • l’autre astuce consiste à ne charger que le train pour l’entraînement (ne chargez pas le jeu d’essai, qui peut généralement avoir la moitié de la taille du train). La phase d’entraînement peut utiliser la mémoire au maximum (100%), donc tout ce qui est disponible est utile. Tout cela est à prendre avec un grain de sel pendant que je teste avec les limites de mémoire de R.
45
tucson

Voici une présentation sur ce sujet qui pourrait vous intéresser:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

Je n'ai pas essayé les choses discutées moi-même, mais le paquetage bigmemory semble très utile

15
Sacha Epskamp

Le moyen le plus simple de contourner cette limitation consiste à basculer sur 64 bits R.

12
David Heffernan

J'ai rencontré un problème similaire et j'ai utilisé 2 clés USB en tant que "ReadyBoost". Les deux disques ont donné une augmentation supplémentaire de 8 Go de mémoire (pour le cache), ce qui a résolu le problème et augmenté la vitesse du système dans son ensemble. Pour utiliser Readyboost, cliquez avec le bouton droit de la souris sur le lecteur, sélectionnez Propriétés, sélectionnez "ReadyBoost", sélectionnez le bouton radio "Utiliser ce périphérique", puis cliquez sur Appliquer ou sur OK pour le configurer.

11
Kwaku Damoah

Si vous exécutez votre script sous Linux, vous pouvez utiliser cette commande:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

et le serveur allouera la mémoire demandée pour vous (en fonction des limites du serveur, mais avec un bon serveur, vous pouvez utiliser des fichiers gigantesques)

7
nurit

J'ai suivi la page d'aide de memor.limit et découvert que sur mon ordinateur, R peut utiliser par défaut jusqu'à environ 1,5 Go de RAM et que l'utilisateur peut augmenter cette limite. En utilisant le code suivant,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

m'a aidé à résoudre mon problème.

6
Rajib Kumar De

La méthode de sauvegarde/chargement mentionnée ci-dessus fonctionne pour moi. Je ne sais pas comment/si gc() défragmente la mémoire mais cela semble fonctionner.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
2
Simon Woodward