50 votes

Libérer la mémoire en R

J'utilise quelques variables, mais une fois qu'elles sont utilisées, je n'en ai plus besoin, donc je dois les supprimer et libérer la mémoire, mais la fonction rm() ne semble pas aider :

memory.size()
30.69
tmp=matrix(rnorm(6e5*20),6e5,20)
memory.size()
207.64
rm(tmp)
memory.size()
207.64

Cela signifie-t-il que j'ai supprimé le tmp mais que la mémoire n'est pas libérée?

55voto

Ben Points 8166

J'utilise gc() pour libérer de la RAM entre les opérations. Voici un exemple de comment je l'utilise dans une boucle, mais consultez ici pour une discussion plus détaillée sur gc() et ici pour plus d'informations sur la gestion de la mémoire pendant une session R.

# charger la bibliothèque
library(topicmodels)

# obtenir des données
data("AssociatedPress")

# définir le nombre de sujets pour commencer
k <- 20

# définir les options du modèle
control_LDA_VEM <-
list(estimate.alpha = TRUE, alpha = 50/k, estimate.beta = TRUE,
verbose = 0, prefix = tempfile(), save = 0, keep = 0,
seed = as.integer(100), nstart = 1, best = TRUE,
var = list(iter.max = 10, tol = 10^-6),
em = list(iter.max = 10, tol = 10^-4),
initialize = "random")

# créer la séquence qui stocke le nombre de sujets à 
# itérer
sequ <- seq(20, 300, by = 20)

# boucle de base pour itérer sur différents nombres de sujets avec gc
# après chaque exécution pour vider la RAM
lda <- vector(mode='list', length = length(sequ))
for(k in sequ) {
  lda[[k]] <- LDA(AssociatedPress[1:20,], k, method= "VEM", control = control_LDA_VEM)
  gc() # c'est ici que je mets la collecte des déchets pour libérer la mémoire avant le prochain tour de la boucle
}

# convertir la sortie de la liste en dataframe (des suggestions pour une méthode plus simple sont les bienvenues !)
best.model.logLik <- data.frame(logLik = as.matrix(lapply(lda[sequ], logLik)), ntopic = sequ)

# tracé
with(best.model.logLik, plot(ntopic, logLik, type = 'l', xlab="Nombre de sujets", ylab="Log-vraisemblance"))

entrer la description de l'image ici

# imprimer le dataframe ordonné pour voir quel nombre de sujets a la log-vraisemblance la plus élevée
(best.model.logLik.sort <- best.model.logLik[order(-as.numeric(best.model.logLik$logLik)), ]) 
    logLik       ntopic
2  -17904.12     40
3  -18105.48     60
1  -18181.84     20
4   -18569.7     80
5  -19736.94    100
6   -21919.6    120
7  -23785.08    140
8  -24914.23    160
9  -25493.76    180
10 -25837.64    200
11 -25964.23    220
12 -26061.01    240
13 -26117.92    260
14 -26149.44    280
15 -26168.91    300

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