195 votes

R gestion de la mémoire / ne peut allouer un vecteur de taille n Mb

Je rencontre des problèmes en essayant d'utiliser de grands objets 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 commençant par cannot allouer un vecteur de taille indique un l'impossibilité d'obtenir de la mémoire, soit parce que la taille a dépassé la limite de l'espace d'adressage d'un processus ou, ou, plus probablement, parce que le système incapable de fournir la mémoire. Notez que sur un système 32 bits, il peut y avoir avoir suffisamment de mémoire libre disponible, mais mais pas un bloc contigu assez grand de d'espace d'adressage dans lequel la mapper.

Comment puis-je contourner ce problème ? 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 la mémoire pour d'autres traitements. Cela se produit même lorsque j'élimine dilligemment les objets inutiles.

EDIT : Oui, désolé : Windows XP SP3, 4Gb 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

0 votes

Essayez d'utiliser 'free' pour désallouer la mémoire des autres processus non utilisés.

5 votes

@ Manoel Galdino : Qu'est-ce que 'free' ? Une fonction R ?

5 votes

@Manoel : En R, la tâche de libérer la mémoire est gérée par le garbage collector, pas par l'utilisateur. Si l'on travaille au niveau du C, on peut manuellement Calloc et Free mémoire, mais je soupçonne que ce n'est pas ce que Benjamin fait.

104voto

mdsumner Points 13001

Demandez-vous si vous avez vraiment besoin de toutes ces données de manière explicite, ou si la matrice peut être éparse ? Il existe un bon support dans R (voir Matrix par exemple) pour les matrices éparses.

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

Si ce qui précède ne peut vous aider, procurez-vous une machine 64 bits avec autant de RAM que vous pouvez vous le permettre, et installez R 64 bits.

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

Si vous ne pouvez pas le faire, les outils de mappage de la mémoire tels que le package ff (ou bigmemory comme le mentionne Sascha) vous aidera à construire une nouvelle solution. D'après mon expérience limitée ff est le paquet le plus avancé, mais vous devriez lire la section High Performance Computing sur le site CRAN Task Views.

1 votes

La tâche est la classification d'images, avec randomForest. J'ai besoin d'une matrice des données d'entraînement (jusqu'à 60 bandes) et de 20 000 à 6 000 000 de lignes pour alimenter randomForest. Actuellement, je plafonne à environ 150 000 lignes car j'ai besoin d'un bloc contigu pour contenir l'objet randomForest résultant... C'est aussi pour cela que bigmemory n'est pas utile, car randomForest nécessite un objet matrice.

0 votes

Que voulez-vous dire par "ne créer que l'objet dont vous avez besoin en une seule session" ?

0 votes

Ne créez "a" qu'une seule fois, si vous vous trompez la première fois, recommencez une nouvelle session.

69voto

tucson Points 1657

Pour les utilisateurs de Windows, ce qui suit m'a beaucoup aidé à comprendre certaines limitations de mémoire :

  • avant d'ouvrir R, ouvrez le moniteur de ressources de Windows (Ctrl-Alt-Delete / Démarrer le gestionnaire de tâches / onglet Performance / cliquer sur le bouton inférieur 'Moniteur de ressources' / onglet Mémoire).
  • vous verrez combien de mémoire RAM nous déjà utilisé avant d'ouvrir R, et par quelles applications. Dans mon cas, 1,6 Go des 4 Go totaux sont utilisés. Je ne pourrai donc obtenir que 2,4 Go pour R, mais le pire est à venir...
  • J'ouvre R et crée un ensemble de données de 1,5 Go, puis je réduis sa taille à 0,5 Go. Le Resource Monitor montre que ma RAM est utilisée à près de 95 %.
  • utiliser gc() pour faire la collecte des déchets \=> cela fonctionne, je peux voir l'utilisation de la mémoire descendre à 2 GB

enter image description here

Conseils supplémentaires qui fonctionnent sur ma machine :

  • préparez les caractéristiques, enregistrez-les dans un fichier RData, fermez R, rouvrez R, et chargez les caractéristiques du train. Le Resource Manager montre généralement une utilisation de la mémoire plus faible, ce qui signifie que même gc() ne récupère pas toute la mémoire possible et la fermeture/réouverture de R fonctionne le mieux pour commencer avec le maximum de mémoire disponible .
  • L'autre astuce consiste à ne charger que l'ensemble de formation pour l'entraînement (ne pas charger l'ensemble de test, qui peut généralement être deux fois plus petit que l'ensemble de formation). La phase de formation peut utiliser la mémoire au maximum (100%), donc tout ce qui est disponible est utile. Tout ceci est à prendre avec un grain de sel car je suis en train d'expérimenter les limites de mémoire de R.

18 votes

R fait le garbage collection tout seul, gc() n'est qu'une illusion. Vérifier le gestionnaire des tâches n'est qu'une opération de base de Windows. Le seul conseil que je peux approuver est de sauvegarder au format .RData.

6 votes

@DavidArenburg gc() est une illusion ? Cela voudrait dire que l'image que j'ai ci-dessus montrant la baisse de l'utilisation de la mémoire est une illusion. Je pense que vous avez tort, mais je peux me tromper.

7 votes

Je ne voulais pas dire que gc() ne fonctionne pas. Je veux juste dire que R le fait automatiquement, donc vous n'avez pas besoin de le faire manuellement. Voir ici

16voto

Sacha Epskamp Points 14956

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 les bigmemory Le paquet semble très utile

4 votes

Fonctionne, sauf quand une classe de matrice est attendue (et non big.matrix)

12voto

David Heffernan Points 292687

Le moyen le plus simple de contourner cette limitation est de passer à R 64 bits.

32 votes

Ce n'est pas un remède en général - j'ai changé, et maintenant j'ai Error: cannot allocate vector of size ... Gb à la place (mais oui, j'ai beaucoup de données).

2 votes

Ce n'est peut-être pas un remède mais ça aide beaucoup. Il suffit de charger de la RAM et de continuer à faire tourner memory.limit(). Ou alors, pensez à partitionner/échantillonner vos données.

0 votes

Si vous rencontrez des difficultés même en 64 bits, qui est essentiellement illimité, c'est probablement plus que vous essayez d'allouer quelque chose de vraiment massif. Avez-vous calculé la taille que devrait avoir le vecteur, en théorie ? Sinon, il se peut que votre ordinateur ait besoin de plus de RAM, mais la quantité disponible est limitée.

-2voto

darckeen Points 416

Essayez d'augmenter la mémoire de votre système avec /3G. http://msdn.microsoft.com/en-us/Windows/hardware/gg487508

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