Вы можете получить верхнюю границу памяти, которая используется при обработке функции и команд с gc
:
smallest.sv <- function(){
A <- matrix(rnorm(1e6), 1e3);
mysvd <- svd(A);
return(tail(mysvd$d, 1));
}
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
x <- smallest.sv()
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#62 MB
rm(x)
Эта верхняя граница зависит от мусорасбор и, следовательно, включение gctorture
даст нижнюю верхнюю границу :
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
gctorture(on = TRUE)
x <- smallest.sv()
gctorture(on = FALSE)
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#53.7 MB
Другие инструменты, такие как Rprof
, Rprofmem
, profmem::profmem
, bench::mark
или profvis::profvis
также может отображать использование памяти.
#Using Rprof (Enable profiling is a compile-time option: ./configure --enable_R_profiling)
gc()
Rprof("Rprof.out", memory.profiling=TRUE)
x <- smallest.sv()
Rprof(NULL)
max(summaryRprof("Rprof.out", memory="both")$by.total$mem.total)
#45.9
#Here at defined intervals the status is checked and so the result depends on if you hit the peak
#Using Rprofmem (Enable momory profiling is a compile-time option: ./configure --enable_memory_profiling)
Rprofmem("Rprofmem.out"); x <- smallest.sv(); Rprofmem(NULL) #Wen first run, there is much more in the log file
gc()
Rprofmem("Rprofmem.out")
x <- smallest.sv()
Rprofmem(NULL)
sum(as.numeric(read.table("Rprofmem.out", comment.char = ":")[,1]), na.rm=TRUE)
#88101752
#Writes out them memory amount when it is allocated
library(profmem) #uses utils::Rprofmem
gc()
total(profmem(x <- smallest.sv()))
#88101752
library(bench) #uses utils::Rprofmem
gc()
mark(x <- smallest.sv())[,"mem_alloc"]
#84MB
#Warning message:
#Some expressions had a GC in every iteration; so filtering is disabled.
library(profvis) #uses utils::Rprof
gc()
profvis(x <- smallest.sv())
#opens a browser window where you can read under Memory -23.0 | 45.9
Rprofmem
показывает память, которая была накоплена, и не учитывает память, которая была освобождена во время выполнения.Чтобы увеличить вероятность того, что Rprof
достигнет пика, вы можете выбрать короткий интервал времени или / и повторить процедуру.
max(replicate(10, {
gc()
Rprof("Rprof.out", memory.profiling=TRUE, interval = runif(1,.005,0.02))
x <- smallest.sv()
Rprof(NULL)
max(summaryRprof("Rprof.out", memory="both")$by.total$mem.total)
}))
#76.4
Здесь я получил более высокое значение, чем полученное из gc
, чтодемонстрирует, что на использование памяти влияет сборка мусора и верхняя граница памяти , используемая во время обработки функции , может варьироваться от вызова к вызову, если gctorture
не включен.