2013-03-22 3 views
25

ich einige Variablen verwenden, aber wenn es verwendet wird, ich es nie wieder brauchen, also muss ich es entfernen und den Speicher freigeben, aber die Funktion rm() scheint nicht helfen:Veröffentlichungsspeicher in R

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

Bedeutet es, dass ich das tmp entferne, aber der Speicher nicht freigegeben wird?

+4

Was '' nach gc() passiert? – Ben

+2

Großartig! gc() ist was ich brauche! – PepsiCo

+0

Es tut mir leid, bekomme ich eine andere Frage, wie ich das Programm laufen, der Speicher verwendet immer größer, so ist es notwendig für mich, etwas gc() während meines Programms hinzufügen? Ich meine einige gc() während meiner Codes hinzufügen, wie # codes # gc() # codes # gc() # codes #, wäre es hilfreich? – PepsiCo

Antwort

33

Ich verwende gc(), um RAM zwischen den Operationen freizugeben. Unten ist ein Beispiel, wie ich es in einer Schleife verwende, aber siehe here für eine detailliertere Diskussion von gc() und here für mehr auf Speicherverwaltung während einer R-Sitzung.

# load library 
library(topicmodels) 

# get data 
data("AssociatedPress")) 

# set number of topics to start with 
k <- 20 

# set model options 
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") 


# create the sequence that stores the number of topics to 
# iterate over 
sequ <- seq(20, 300, by = 20) 

# basic loop to iterate over different topic numbers with gc 
# after each run to empty out 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() # here's where I put the garbage collection to free up memory before the next round of the loop 
} 

# convert list output to dataframe (suggestions for a simpler method are welcome!) 
best.model.logLik <- data.frame(logLik = as.matrix(lapply(lda[sequ], logLik)), ntopic = sequ) 

# plot 
with(best.model.logLik, plot(ntopic, logLik, type = 'l', xlab="Number of topics", ylab="Log likelihood")) 

enter image description here

# print ordered dataframe to see which number of topics has the highest log likelihood 
(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 
+2

Dies ist ein klassischer Fall des zweiten Kreises von R Hölle. Niemals Vektoren (oder Objekte) innerhalb einer Schleife wachsen lassen. 'lda <- vector (mode = 'list', length = seq)' ('seq' ist ein Funktionsname in R, eine gute Idee, diese als Objektnamen zu vermeiden, da dies zu Verwirrung führen kann). Wahrscheinlich möchten Sie mit '[< mnel

+0

@mnel Vielen Dank für Ihren instruktiven und detaillierten Kommentar! Ich habe meine Antwort entsprechend bearbeitet. – Ben

+0

Ich sollte hinzufügen, dass ab 20 Themen für 20 Dokumente ist ein bisschen albern. Ich hätte mit weniger Themen anfangen sollen als Dokumente, z. 'sequ <- seq (5, 200, by = 5)' – Ben