2013-03-22 29 views
25

tôi sử dụng một số biến, nhưng khi nó được sử dụng, tôi không bao giờ cần đến nó một lần nữa, vì vậy tôi cần phải loại bỏ nó và giải phóng bộ nhớ, nhưng chức năng rm() dường như không giúp đỡ:bộ nhớ phát hành vào R

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

Điều đó có nghĩa là tôi loại bỏ tmp nhưng bộ nhớ không được giải phóng?

+4

gì sẽ xảy ra sau khi 'gc() '? – Ben

+2

Tuyệt vời! gc() là những gì tôi cần! – PepsiCo

+0

Tôi xin lỗi, tôi nhận được một câu hỏi khác, khi tôi chạy chương trình, bộ nhớ được sử dụng lớn hơn và lớn hơn, do đó, nó là cần thiết cho tôi để thêm một số gc() trong chương trình của tôi? Tôi có nghĩa là thêm một số gc() trong mã của tôi, chẳng hạn như # mã # gc() # mã # gc() # mã #, nó có hữu ích không? – PepsiCo

Trả lời

33

Tôi sử dụng gc() để giải phóng RAM giữa các thao tác. Dưới đây là ví dụ về cách tôi sử dụng nó trong một vòng lặp, nhưng xem here để có một cuộc thảo luận chi tiết hơn về gc()here để biết thêm về quản lý bộ nhớ trong một phiên 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

Đây là trường hợp điển hình của vòng tròn thứ hai của R Địa ngục. Không bao giờ phát triển vectơ (hoặc đối tượng) trong vòng một vòng lặp. 'lda <- vectơ (mode = 'list', length = seq)' ('seq' là tên hàm trong R, ý tưởng tốt để tránh chúng như tên đối tượng, vì nó có thể dẫn đến nhầm lẫn). Bạn có thể muốn gán với '[[<-' không' [<-' nếu 'k' luôn luôn là số nguyên chiều dài 1. – mnel

+0

@mnel cảm ơn bạn đã nhận xét và chi tiết! Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. – Ben

+0

Tôi nên thêm rằng bắt đầu từ 20 chủ đề cho 20 tài liệu là một chút ngớ ngẩn. Tôi nên bắt đầu với ít chủ đề hơn ví dụ như tài liệu. 'sequ <- seq (5, 200, by = 5)' – Ben

Các vấn đề liên quan