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
etFree
mémoire, mais je soupçonne que ce n'est pas ce que Benjamin fait.0 votes
Dans la bibliothèque XML, vous pouvez utiliser gratuitement. Extrait de la documentation : "Cette fonction générique est disponible pour libérer explicitement la mémoire associée à l'objet donné. Elle est destinée à être utilisée sur des objets pointeurs externes qui ne disposent pas d'une fonction/routine finalisatrice automatique qui nettoie la mémoire utilisée par l'objet natif."