Aleix Ruiz de Villa
2013-Jan-29 16:52 UTC
[R-es] Tamaño de objetos en memoria y read.table
Buenas, tengo un archivo de texto con números (enteros) que ocupa 23 Mb. Leo este archivo utilizando read.table() y luego mido el tamaño con object.size(), obteniendo 35 Mb. El tema es que por otro lado, monitorizo la memoria utilizada (Windows Task Manager) y aumenta 500 Mb aprox. He repetido este proceso varias veces intentando que no haya interferencias con otros programas, y siempre me pasa lo mismo. Mi pregunta es, qué es lo que ocupa tanta memoria? a alguien le suena que le haya pasado algo parecido? 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? Hay alguna manera de optimizar esto? Utilizo Windows Vista, R 64 bits, 2.15. Muchas gracias por adelantado Aleix Ruiz de Villa [[alternative HTML version deleted]]
Hola, Mira estas discusiones y las referencias que aparecen (en particular la primera): http://stackoverflow.com/questions/5749058/extend-memory-size-limit-in-r/5749189#5749189 http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command http://stackoverflow.com/questions/11579765/how-to-clean-up-memory-not-need-to-restart-my-pc Saludos, Carlos Ortega www.qualityexcellence.es El 29 de enero de 2013 17:52, Aleix Ruiz de Villa <aleixrvr.info@gmail.com>escribió:> Buenas, > > tengo un archivo de texto con números (enteros) que ocupa 23 Mb. Leo este > archivo utilizando read.table() y luego mido el tamaño con object.size(), > obteniendo 35 Mb. El tema es que por otro lado, monitorizo la memoria > utilizada (Windows Task Manager) y aumenta 500 Mb aprox. He repetido este > proceso varias veces intentando que no haya interferencias con otros > programas, y siempre me pasa lo mismo. > > Mi pregunta es, qué es lo que ocupa tanta memoria? a alguien le suena que > le haya pasado algo parecido? > > 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? > > Hay alguna manera de optimizar esto? > > > Utilizo Windows Vista, R 64 bits, 2.15. > > Muchas gracias por adelantado > > Aleix Ruiz de Villa > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2013-Jan-29 17:37 UTC
[R-es] Tamaño de objetos en memoria y read.table
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
Aleix Ruiz de Villa
2013-Jan-30 11:58 UTC
[R-es] Tamaño de objetos en memoria y read.table
Muchas gracias a los dos. Al final lo he resuelto utilizando la función scan() con un un código del tipo (para leer una matriz de enteros con row.names y colN columnas) auxData <- scan( fileName, what = c( " ", as.list( rep( 0L, colN ) ) ) ) myMat <<- do.call(cbind, auxData[-1]) row.names(myMat) <<- auxData[[1]] el ahorro (no del todo preciso porque en el código hacía otras cosas secundarias) es del orden de un 10% del tiempo de lectura, un 60% memoria (segun el Taks Manager de Windows), y el de no tener que buscar un ordenador en el trabajo más potente (jejeje, sin necesidad de utilizar otros paquetes) para leer los archivos. Aleix El 29 de enero de 2013 18:37, Carlos J. Gil Bellosta <cgb@datanalytics.com>escribió:> 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 >[[alternative HTML version deleted]]