2013-03-22 6 views
25

я использую некоторые переменные, но когда он используется, я никогда не нужно снова, так что мне нужно, чтобы удалить его и освободить память, но функция гт(), похоже, не поможет:Освобождение памяти в R

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

Означает ли это, что я удаляю tmp, но память не освобождается?

+4

Что происходит после того, как 'дс()'? – Ben

+2

Отлично! gc() - то, что мне нужно! – PepsiCo

+0

Прошу прощения, у меня возникает другой вопрос, когда я запускаю программу, память используется все больше и больше, поэтому мне нужно добавить gc() во время моей программы? Я имею в виду добавить некоторые gc() во время моих кодов, например # коды # gc() # коды # gc() # codes #, было бы полезно? – PepsiCo

ответ

33

Я использую gc(), чтобы освободить оперативную память между операциями. Ниже приведен пример того, как я использую его в цикле, но см. here для более подробного обсуждения gc() и here для получения дополнительной информации об управлении памятью во время сеанса R.

# 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

Это классический случай второго круга R ад. Никогда не выращивайте векторы (или объекты) внутри цикла. 'lda <- vector (mode = 'list', length = seq)' ('seq' - это имя функции в R, рекомендуется избегать их как имен объектов, так как это может привести к путанице). Вероятно, вы хотите назначить '[[<-' не' [<-', если 'k' всегда целая длина 1. – mnel

+0

@mnel благодарит вас за ваш поучительный и подробный комментарий! Я отредактировал свой ответ соответственно. – Ben

+0

Я должен добавить, что начиная с 20 тем для 20 документов немного глупо. Я должен был начать с меньших тем, чем документы, например. 'sequ <- seq (5, 200, by = 5)' – Ben

Смежные вопросы