2011-10-19 18 views
4

當我使用MNP程序包時,有關於R中內存使用的問題。我的目標是估計多項式概率模型,然後使用該模型預測大量數據集上的選擇。我已經將預測數據分成了一系列的部分。當在R中使用MNP程序包時發生內存泄漏

問題是,當我遍歷列表進行預測時,R使用的內存會不斷增大並在達到我的計算機的最大內存後使用交換空間。即使遇到這些邊界,分配的內存也不會釋放。即使我不創建任何其他對象,所以我不明白髮生了什麼。

下面我粘貼了一個示例代碼,它遇到了上述問題。運行示例時,內存不斷增大,即使在刪除所有變量並調用gc()後仍保持使用狀態。

我擁有的真實數據比示例中生成的數據大得多,所以我需要找到解決方法。

我的問題是:

爲什麼這個腳本中使用這麼多內存?

如何強制R在每個步驟後釋放分配的內存?

library(MNP) 

nr <- 10000 
draws <- 500 
pieces <- 100 

# Create artificial training data 
trainingData <- data.frame(y = sample(c(1,2,3), nr, rep = T), x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr)) 

# Create artificial predictor data 
predictorData <- list() 
for(i in 1:pieces){ 
    predictorData[[i]] <- data.frame(y = NA, x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr)) 
} 

# Estimate multinomial probit 
mnp.out <- mnp(y ~ x1 + x2, trainingData, n.draws = draws) 

# Predict using predictor data 
predicted <- list() 
for(i in 1:length(predictorData)){ 
    cat('|') 
    mnp.pred <- predict(mnp.out, predictorData[[i]], type = 'prob')$p 
    mnp.pred <- colnames(mnp.pred)[apply(mnp.pred, 1, which.max)] 
    predicted[[i]] <- mnp.pred 
    rm(mnp.pred) 
    gc() 
} 

# Unite output into one string 
predicted <- factor(unlist(predicted)) 

下面是運行腳本後的輸出統計:

> rm(list = ls()) 
> gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 158950 8.5  407500 21.8 407500 21.8 
Vcells 142001 1.1 33026373 252.0 61418067 468.6 

這裏有我的R規格:

> sessionInfo() 

R version 2.13.1 (2011-07-08) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] MNP_2.6-2 MASS_7.3-14 
+0

運行上述腳本(包括rm()和gc())後,我的計算機上使用的內存如下:'RSIZE 5661M,VPRVT 6108M,VSIZE 9500M' – yellowcap

+0

這是特有的。運行此程序之前,虛擬內存使用情況如何?至於駐留內存,這可能是虛假的 - 有時這些是可以被操作系統回收的緩衝區。如果OSX有'free',請嘗試並報告該信息。另外,如果使用最新版本的R,會發生什麼?我發現沒有更新版本的MNP。 – Iterator

回答

1

結果似乎並不反常,因爲在我不要認爲這證明了內存泄漏。我懷疑你誤讀了gc()的數據:右邊的列是R在跟蹤內存期間使用的最大內存。如果你使用的是gc(reset = TRUE),那麼顯示的最大值將是LHS中使用的內存,即8.5 MB和1.1MB列在「使用」下。

我懷疑MNP在預測階段只消耗大量內存,所以除了將預測數據分成更小的塊和更少的行之外,沒有什麼可以完成的。

如果你有多個內核,你可能會考慮使用foreach封裝,doSMPdoMC一起,因爲這會給你獨立計算的加速和清算分配的RAM的好處後循環的每次迭代完成(因爲它涉及到一個使用獨立內存空間的R分支,我相信)。

+0

使用'foreach'包可以解決部分問題,這是一個好主意。但預測器循環中的問題仍然存在。至少在我的計算機上,R在這個腳本中使用的內存穩步增長,並且只有在退出R後纔會釋放。我編輯腳本並將碎片的數量增加到100。如果我在計算機上運行編輯後的腳本,預測器循環會增加內存使用量,即使內存達到最大內存(它只是開始使用交換空間)也不會釋放內存。 – yellowcap

+0

如果'foreach'不能解決問題,我想最好聯繫維護人員。您也可以嘗試使用Unix實用程序'valgrind'來查看是否有任何內存泄漏出現。我認爲這也適用於OS X. – Iterator

相關問題