Au cours de la vectorisation de code de simulation, je suis tombé sur un problème de mémoire. J'utilise la version 2.15.0 32 bits R (via RStudio version 0.96.122) sous Windows XP. Ma machine a 3,46 Go de RAM.
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.0-6 lattice_0.20-6 MASS_7.3-18
loaded via a namespace (and not attached):
[1] grid_2.15.0 tools_2.15.0
Voici un exemple minimal du problème:
> memory.limit(3000)
[1] 3000
> rm(list = ls())
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1069761 28.6 1710298 45.7 1710298 45.7
Vcells 901466 6.9 21692001 165.5 173386187 1322.9
> N <- 894993
> library(MASS)
> sims <- mvrnorm(n = N, mu = rep(0, 11), Sigma = diag(nrow = 11))
> sims <- mvrnorm(n = N + 1, mu = rep(0, 11), Sigma = diag(nrow = 11))
Error: cannot allocate vector of size 75.1 Mb
(Dans mon application, la matrice de covariance Sigma n'est pas diagonale, mais j'obtiens la même erreur de toute façon.)
J'ai passé l'après-midi à lire des informations sur les problèmes d'allocation de mémoire dans R (y compris ici , ici et ici ). D'après ce que j'ai lu, j'ai l'impression qu'il ne s'agit pas de la RAM disponible en tant que telle, mais de l'espace d'adressage continu disponible. Pourtant, 75,1Mo me semble assez petit.
J'apprécierais énormément vos pensées et vos suggestions.
R est arrivé au point où le système d'exploitation ne peut pas l'allouer un autre 75,1 Mo de mémoire vive. C'est la taille du bloc de mémoire nécessaire pour effectuer la prochaine sous-opération. Il ne s'agit pas d'une déclaration sur la quantité de RAM contiguë requise pour mener à bien l'ensemble du processus. À ce stade, tous vos RAM disponibles sont épuisés, mais vous avez besoin de plus de mémoire pour continuer et le système d'exploitation ne parvient pas à mettre plus de RAM à la disposition de R.
Les solutions potentielles à cela sont multiples. La solution évidente est de vous procurer une machine 64 bits avec plus de RAM. J'oublie les détails, mais le code IIRC sous Windows 32 bits, chaque processus ne peut utiliser qu'une quantité limitée de RAM (2 Go?) Et, peu importe le fait que Windows conservera un bloc de mémoire pour lui-même, le RAM disponible pour R sera légèrement inférieur à 3,4 Go que vous avez. Sur Windows 64 bits, vous pourrez utiliser plus de RAM et augmenter la quantité maximale de RAM que vous pouvez adapter/installer.
Si cela n’est pas possible, envisagez une autre approche; faites peut-être vos simulations par lots avec le n par lot beaucoup plus petit que N
. De cette façon, vous pouvez dessiner un nombre beaucoup plus réduit de simulations, faire ce que vous voulez, collecter des résultats, puis répéter ce processus jusqu'à ce que vous ayez effectué suffisamment de simulations. Vous ne montrez pas ce que N
est, mais je soupçonne que c'est grand, alors essayez plus petit N
plusieurs fois pour vous donner N
globalement.
J'ai eu le même avertissement en utilisant le paquetage raster.
> my_mask[my_mask[] != 1] <- NA
Error: cannot allocate vector of size 5.4 Gb
La solution est très simple et consiste à augmenter la capacité de stockage de R, ici la ligne de code:
##To know the current storage capacity
> memory.limit()
[1] 8103
## To increase the storage capacity
> memory.limit(size=56000)
[1] 56000
## I did this to increase my storage capacity to 7GB
Espérons que cela vous aidera à résoudre le problème
gc()
peut vous aider
l'enregistrement de données au format .RData, la fermeture, la réouverture de R et le chargement du RData peuvent être utiles.
voir ma réponse ici: https://stackoverflow.com/a/24754706/190791 pour plus de détails
est-ce que R s'arrête peu importe la valeur N que vous utilisez? essayez d’utiliser de petites valeurs et voyez si c’est la fonction mvrnorm qui pose problème ou vous pouvez simplement la boucler sur des sous-ensembles. Insérez la fonction gc()
dans la boucle pour libérer en continu des RAM