2011-10-21 11 views
33

¿Es posible controlar la cantidad de memoria que está en uso o que R ha utilizado para llamar a una función? Por ejemplo, tengo una función arbitraria, por ejemplo:Monitorizar el uso de la memoria en R

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

Ejecución de la función simplemente devuelve un escalar, pero una gran cantidad de memoria se utilizó para calcular la función. Ahora necesito hacer benchmarking de rendimiento. El tiempo de procesamiento es fácil:

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

Sin embargo también me gustaría saber la cantidad de memoria que se necesitaba para esta llamada, sin modificar la función (que debería funcionar para funciones arbitrarias). ¿Hay alguna manera de hacer esto?

Editar: para aclarar un poco. Estoy interesado principalmente en el límite superior de la memoria que estaba en uso durante la llamada de la función, es decir, cuánta memoria física se requiere para poder procesar la llamada a la función. En muchos casos, esto es significativamente menor que la cantidad total de memoria asignada, creo.

+0

Hola Jeroen. ¿Resolviste este problema? ¿Cuál fue tu solución? También estoy enfrentando este problema. Deseo monitorear el límite superior de la memoria utilizada durante la llamada de la función. –

+0

Eche un vistazo a profvis: https://github.com/rstudio/profvis – Jeroen

+0

gracias, Jerson. Lo revisé antes. Pero me parece que el paquete solo se usa para perfilar el tiempo utilizado por el código. No vi la funcionalidad de la supervisión de la memoria. ¿Me perdí algo aquí? ¿O podrías darme más pistas? –

Respuesta

19

R proporciona soporte de perfiles de memoria, ver Section 3.3 of the Writing R Extensions manual:

3,3 código Profiling R para el uso de memoria

Medición de uso de memoria en el código R es útil ya sea cuando el código toma más memoria que está convenientemente disponible o cuando la asignación de memoria y la copia de objetos es responsable de la lentitud del código. Hay tres formas de para perfilar el uso de la memoria a lo largo del tiempo en el código R. Los tres requieren R a se han compilado con `--enable-memory-profiling ', que no es el predeterminado, pero actualmente se usa para las distribuciones binarias de Mac OS X y Windows . Todo puede ser engañoso, por diferentes razones.

Al entender los perfiles de memoria, es útil conocer un poco más sobre acerca de la asignación de memoria de R. Al mirar los resultados de `gc() ' se muestra una división de memoria en` Vcells' utilizada para almacenar los contenidos de vectores y `Ncells 'utilizados para almacenar todo lo demás, incluida toda la sobrecarga administrativa para vectores como tipo y longitud información. De hecho, los contenidos vectoriales se dividen en dos grupos. La memoria para los vectores pequeños (por defecto 128 bytes o menos) se obtiene en trozos grandes y luego se parcela por R; la memoria para vectores más grandes es obtenida directamente del sistema operativo.

y luego proporciona tres secciones más.

10

Una opción es usar Rprof. Un enfoque simple es este:

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

[your code] 

Rprof(NULL) 
summaryRprof(tf) 

Esto le dará cierta información sobre el uso de la memoria.

+0

Gracias esto es útil.Sin embargo, según tengo entendido, Rprofmem registra toda la memoria que se asignó, pero no tiene en cuenta la colección de grabación. Estoy más interesado en el límite superior de la memoria que está en uso durante el procesamiento de la función. – Jeroen

+2

Puede usar el monitor de rendimiento de su sistema operativo. Tome un lector antes de la operación y un lector después. En Windows eso es perfmon – SFun28