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 (à partir d' ici ):
Les messages d'erreur commençant ne peut pas allouer de vecteur de taille indiquent un échec d'obtention de mémoire, soit parce que la taille a dépassé la limite d'espace d'adressage pour un processus ou, plus probablement, 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 un bloc suffisamment grand d'espace d'adressage contigu pour le mapper.
Comment puis-je contourner cela? Ma principale difficulté est que j'arrive à un certain point de mon script et que R ne peut pas allouer 200-300 Mb pour un objet ... Je ne peux pas vraiment pré-allouer le bloc car j'ai besoin de mémoire pour d'autres traitements. Cela se produit même lorsque je supprime soigneusement les 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
Calloc
etFree
mémoire, mais je soupçonne que ce n'est pas ce que fait Benjamin.Réponses:
Déterminez si vous avez vraiment besoin de toutes ces données de manière explicite, ou la matrice peut-elle être clairsemée? Il existe un bon support dans R (voir le
Matrix
package pour par exemple) pour les matrices creuses.Réduisez au minimum tous les autres processus et objets de R lorsque vous devez créer des objets de cette taille. Utilisez
gc()
pour effacer la mémoire maintenant inutilisée, ou mieux ne créez que l'objet dont vous avez besoin en une seule session .Si ce qui précède ne peut pas 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 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 mémoire comme package
ff
(oubigmemory
comme Sascha le mentionne) vous aideront à créer une nouvelle solution. Dans mon expérience limitéeff
est le package le plus avancé, mais vous devriez lire laHigh Performance Computing
rubrique sur les vues de tâches CRAN.la source
Pour les utilisateurs de Windows, ce qui suit m'a beaucoup aidé à comprendre certaines limitations de la mémoire:
gc()
pour faire le ramasse-miettes => ça marche, je peux voir l'utilisation de la mémoire descendre à 2 GoConseil supplémentaire qui fonctionne sur ma machine:
la source
gc()
n'est qu'une illusion. La vérification du gestionnaire de tâches n'est qu'une opération très basique de Windows. Le seul conseil avec lequel je suis d'accord est l'enregistrement au format .RDatagc()
ça ne marche pas. Je veux juste dire que R le fait automatiquement, vous n'avez donc pas besoin de le faire manuellement. Voir icigc()
FONCTIONNE . Vous n'avez tout simplement pas besoin de l'utiliser parce que R le fait en interneVoici 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
bigmemory
package semble très utilela source
Le moyen le plus simple de contourner cette limitation est de passer à 64 bits R.
la source
Error: cannot allocate vector of size ... Gb
place (mais oui, j'ai beaucoup de données).J'ai rencontré un problème similaire et j'ai utilisé 2 lecteurs flash comme «ReadyBoost». Les deux disques ont augmenté de 8 Go de mémoire supplémentaire (pour le cache) et ont résolu le problème et ont également augmenté la vitesse du système dans son ensemble. Pour utiliser Readyboost, faites un clic droit sur le lecteur, allez dans les propriétés et sélectionnez 'ReadyBoost' et sélectionnez le bouton radio 'utiliser cet appareil' et cliquez sur appliquer ou sur ok pour configurer.
la source
J'ai suivi la page d'aide de memor.limit et j'ai découvert que sur mon ordinateur, R par défaut peut utiliser jusqu'à ~ 1,5 Go de RAM et que l'utilisateur peut augmenter cette limite. En utilisant le code suivant,
m'a aidé à résoudre mon problème.
la source
Si vous exécutez votre script dans un environnement Linux, vous pouvez utiliser cette commande:
et le serveur vous allouera la mémoire demandée (selon les limites du serveur, mais avec un bon serveur - des fichiers énormes peuvent être utilisés)
la source
server_name
? Je rencontre çacannot allocate vector size...
en essayant de faire une énorme matrice de termes de document sur une AMI et je ne peux pas comprendre pourquoi il n'a pas assez de mémoire, ou combien je dois en louer. Je vous remercie!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.la source