2012-07-26 12 views
6

Vi el siguiente comportamiento. Digamos que cree la siguiente matriz multidimensional:La memoria reservada de R es dos veces el tamaño de una matriz asignada

spam = array(runif(96*48*60*360), dim = c(96,48,60,360)) 

Es bastante predecible la cantidad de memoria R debe utilizar para este, a saber (96 * 48 * 60 * 360) * 4 bytes = 759,4 Mbyte. Esto está muy bien confirmada mediante la función de lsos (ver this post):

> lsos() 
     Type  Size PrettySize Rows Columns 
spam array 796262520 759.4 Mb 96  48 
lsos function  776 776 bytes NA  NA 

R como un proceso, sin embargo utiliza mucha más memoria, más o menos el doble del tamaño:

$ top | grep rsession 
82:17628 hiemstra 20 0 1614m **1.5g** 8996 S 0.3 40.4 0:04.85 rsession 

¿Por qué R hacer esto? Supongo que la memoria reservada adicional se asigna para que sea más rápidamente accesible para R? ¿Alguna idea?

Respuesta

6

Porque el recolector de basura no se ha ejecutado todavía.
Así que hay una gran cantidad de basura, probablemente generada durante la creación de la gran matriz, que debe ser limpiada.

Si se fuerza una recolección de basura llamando gc() función, se verá que la memoria usada será bastante cerca del tamaño de la matriz:

> memory.size() 
[1] 775.96 
+0

Así que al final del array utiliza 759,4 Mbytes, pero durante la creación, ¿usa más? Eso podría ser desafortunado si la matriz se ajusta a la memoria, pero el aumento en el uso de la memoria durante la creación utiliza más que la cantidad de memoria disponible. –

+1

Bueno, no sé exactamente qué sucede bajo el capó, pero con tu código no estás simplemente asignando una matriz; de hecho, primero genera un vector de números aleatorios, luego asigna una matriz copiando esos valores. Entonces, creo que la mayor parte de la sobrecarga (es decir, basura) se debe a ese vector desechable ... – digEmAll

+0

Sin embargo, supongo que el recolector de basura se activa automáticamente cuando se está agotando, así que no creo que sea un rendimiento problemas en cuanto a que la matriz se ajusta a la memoria ... – digEmAll

Cuestiones relacionadas