2011-10-21 71 views
33

是否可以監視正在使用或已被R用來調用某個函數的內存量?例如,我有一個任意函數,e.g:監視R中的內存使用情況

smallest.sv <- function(){ 
    A <- matrix(rnorm(1e6), 1e3); 
    mysvd <- svd(A); 
    return(tail(mysvd$d, 1)); 
} 

運行函數返回一個標量,而是使用了大量的內存來計算功能。現在我需要做性能基準測試。處理時間很簡單:

system.time(x <- smallest.sv()) 

不過,我也想知道有多少內存需要此調用,無需修改功能(它應該任意函數工作)。有沒有辦法做到這一點?

編輯:澄清一下。我最感興趣的是函數調用期間使用的內存上限,即需要多少物理內存來處理函數調用。在很多情況下,這大大低於我認爲分配的內存總量。

+0

嗨Jeroen。你解決了這個問題嗎?你的解決方案是什麼?我也面臨這個問題。我希望監視函數調用期間使用的內存上限。 –

+0

看看profvis:https://github.com/rstudio/profvis – Jeroen

+0

謝謝,Jerson。我之前確實檢查過。但在我看來,軟件包僅用於分析代碼使用的時間。我沒有看到內存監控的功能。我在這裏錯過了什麼嗎?或者你能給我更多提示嗎? –

回答

19

ř提供存儲器分析支持,見Section 3.3 of the Writing R Extensions manual

3.3內存使用仿形R代碼裏面

測量中的R代碼存儲器的使用是有用的任一當代碼發生 更多的內存比方便可用或者當內存分配 和對象的拷貝造成慢碼時。在R代碼中,有三種方法可以分析內存使用情況。所有這三個要求R到 都已經用`--enable-memory-profiling'進行了編譯,這不是 的默認值,但是當前用於Mac OS X和Windows二進制文件 的發行版。由於不同的原因,所有這些都可能是誤導性的。

在理解內存配置文件時,瞭解有關R的內存分配的更多內容將有助於您進一步瞭解 。查看'gc()' 的結果,顯示了將內存劃分爲'Vcell',用於存儲向量的內容和用於存儲其他所有內容的'Ncell'的內容,包括所有向量的管理開銷,例如type和長度 信息。事實上,矢量內容被分成兩個池。 用於小向量的內存(默認128字節或更少)在 大塊中獲得,然後由R分出;直接從操作系統獲得的較大向量的內存爲 。

然後再提供三個部分。

10

一個選項是使用Rprof。一個簡單的方法是:

Rprof(tf <- "rprof.log", memory.profiling=TRUE) 

[your code] 

Rprof(NULL) 
summaryRprof(tf) 

這會給你一些關於內存使用情況的信息。

+0

謝謝這很有用。但是,據我所知,Rprofmem記錄了所有已分配的內存,但它沒有考慮到垃圾收集?我最感興趣的是在處理函數期間使用的內存的上限。 – Jeroen

+2

你可以使用你的操作系統的性能監視器。在手術前和讀者之後帶上讀者。在perfmon的Windows上 – SFun28