domingo, 17 de enero de 2010

Tiempo de lectura rapida y compresión de archivos con R

A quien no le ha pasado que la lectura y manipulación de documentos en archivo plano es muy tediosa para el trabajo con el software R,  no solo porque la lectura de estos es demasiado lenta sino también porque los documento en estos formatos es muy pesada y ocupa demasiado espacio en el disco. Esto es muy común y David Smith en su blog Revolutions nos comenta de una característica para la versión 2.10 de R para solucionar este tipo de problemas.

Básicamente consiste en comprimir el archivo plano en formatos como gzip, bzip2, xvz (me llamaba la atención es que la plataforma Linux comprime estos archivos en esos formatos bajo unos comandos de consola, mientras que Windows se debe considerar un software, una buena opción es 7-zip) esto ahorra espacio en el disco duro y a su vez tiempo de lectura en el software R. Esto es una gran ayuda y una mejora sustancial del mismo R. Aunque no es la única opción disponible, también se puede conseguir comprimir estos archivos planos con dos formatos especiales que los hace el mismo R, uno de ellos es el formato del software Stata cuya extensión es .dta (R permite después de una lectura de un archivo exportar los mismos en formato .dta) y el otro formato es el mismo que utiliza el R, los archivos con extensión .Rdata.

Veamos cómo se consigue esto

Generemos un base de por lo menos 100 preguntas y 100000 registros  y guardemos este archivo en un directorio de trabajo

X <- matrix(rnorm(1e7), ncol=100)
write.table(X, file="c:/X.txt", sep=",", row.names=FALSE, col.names=FALSE)
file.info("c:/X.txt")$size
[1] 181915087

Notamos que el documento pesa casi 182 Megas. Ahora teniendo esto comprobemos el tiempo de lectura de este archivo de texto con dos comandos básicos de lectura de archivos el read.table y scan

system.time(read.table("c:/X.txt"))
user  system elapsed
107.07    0.38  108.11
system.time(scan("c:/X.txt", sep=",", what=rep(0,10)))
Read 10000000 items
user  system elapsed
34.47    0.37   34.95

Observemos que el tiempo de lectura de este archivo con el read.table es casi 107 segundos mientras que el scan lee el archivo en casi 35 segundos.

Pasemos ahora a guardar esta base en el formato .Rdata y el formato .dta de Stata con R (para realizar esto último tenemos que llamar la librería foregin la cual permite leer y escribir bases en diferentes formatos)

save(X,file="c:/X.Rdata")
file.info("c:/X.Rdata")$size
[1] 76854086
library(foreign)
write.dta(as.data.frame(X), file = "c:/X.dta", version = 7)
file.info("c:/X.dta")$size
[1] 80016316

Notamos que el archivo en formato .Rdata pesa casi 77 Megas y con el formato .dta pesa casi 80 Megas. Miremos los tiempos de lectura de estos últimos formatos

system.time(load("c:/X.Rdata"))
user  system elapsed
3.55    0.13    3.71
system.time(read.dta("c:/X.dta"))
user  system elapsed
2.09    0.12    2.28

Vemos un tiempo de lectura de casi 4 segundos con el formato .Rdata mientras el formato .dta se lee en 2 segundos.

Notese que que se ha reducido considerablemente el peso del archivo ASCII en casi un 55% del tamaño original con los formatos .Rdata y .dta y ni hablar de los tiempos de lectura mejoran demasiado. Ahora como un archivo no se lee una sola vez los tiempos de lectura no tienen que ser los mismos. Vamos a probar este pequeño detalle mediante un ejercicio de simulación comparando el tiempo de lectura promedio de archivos que contengan entre 1000, 10000, 100000, 1000000 y 10000000 observaciones. Los resultados se pueden observar en el siguiente gráfico


Conclusión los formatos comprimidos en .Rdata y .dta son más rápidos  de leer que los archivos sin comprimir. Cabe resaltar que David Smith hace pruebas similares con los formatos .gzip, .txt y .dta, llegando a la conclusión que el formato .dta mejora sustancialmente en el tiempo de lectura mientras que el archivo comprimido .gzip no lo hace. Una observación más que note es que los archivos en formato .Rdata por trabajar en el mismo R son mucho más livianos con datos reales.

Ver tambien: Nuevo año 2010 con R, R-commander, software R, sobre Matlab y R.

No hay comentarios:

Publicar un comentario