[R-es] Tamaño de objetos en memoria y read.table

Carlos J. Gil Bellosta cgb en datanalytics.com
Mar Ene 29 18:37:02 CET 2013


Hola, ¿qué tal?

> Por otro lado, si escribo un fichero de texto con un único 1, y lo leo con
> read.table, me devuelve un data.frame de 680 bytes y, en particular, el 1
> (elemento [1,1]) es un "integer" que ocupa 48 bytes, cuando tengo entendido
> que la representación de un entero ocupa 1 byte. Entiendo que un "integer"
> de R tenga más cosas que la pura representación numerica, pero puede ser
> esto la causa de que al leer archivos mayores, la memoria se me dispare?

Seguramente, [1,1] no es un "integer" (aunque lo parezca):

> object.size(rep(1,1000))
8040 bytes
> object.size(rep(1L,1000))
4040 bytes
> typeof(1)
[1] "double"
> typeof(1L)
[1] "integer"

R utiliza 4 bytes para los enteros (que lo sean realmente) y 8 para
los "doubles". Al menos, en mi máquina. Puedes ver lo que hace en la
tuya corriendo

.Machine

Sobre la memoria necesaria para leer un fichero de texto con
read.table, generalmente, hace falta el triple de la que ocupa el
fichero. O eso creo recordar. Si lo hago bien (miré esas cosas hace
tiempo), read.table conserva tres copias del objeto (con
transformaciones) en memoria para leer línea a línea y convertir en un
df que almancena datos columna a columna y los transforma en su
formato.

Además, en función del tipo de datos que haya en tu fichero ("1" ocupa
un byte, pero R necesita 8 para almacenarlo) hay una "explosión" en el
uso de memoria.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



Más información sobre la lista de distribución R-help-es