Carlos J. Gil Bellosta
2009-May-10 14:40 UTC
[R-es] Leyendo ficheros de datos enormes con R: nuevo paquete "colbycol"
Hola, ¿qué tal? Leer ficheros de texto de varios GBs de tamaño con datos desde R representa un problema recurrente. He creado un proto-paquete (dejará de apellidarse "proto" cuando achique la lista de los TODOs) que permite hacer "algo" cuando uno se enfrenta a dicho problema. La estrategia es la siguiente: 1) La función de lectura de R reenvía el fichero a un script en python que lee el fichero línea a línea. 2) Este script crea n ficheros de texto, donde n es el número de columnas. 3) R lee entonces cada fichero-columna individualmente. 4) R reemplaza los ficheros-columna de texto por volcados de los objetos de R correspondientes con "save". 5) Lo único que queda en memoria es un objeto con metadatos que sabe leer las columnas una a una. El usuario puede entonces analizar las columnas (por ejemplo, en busca de atípicos, etc.), crear data.frames de análisis con las columnas interesantes, remuestrear las columnas para crear suconjuntos de los datos, etc. Con este paquete he conseguido leer un fichero que originalmente ocupaba 3.5GB y examinar su contenido. Sobre el objeto que reside en memoria (de la clase colbycol) se pueden aplicar las funciones ncol, nrow, colnames, etc. La lista de los TODOs, como anunciaba, es extensa: 1) "Produccionalizarlo" controlando más errores, etc. 2) Añadirle funciones adicionales que hagan más cómodo el trabajar con estos nuevos objetos. 3) Permitir que los objetos creados puedan hacerse persistentes entre sesiones, es decir, que puedan guardarse y abrirse en una nueva sesión. 4) Ver si funciona sobre Windows (debería funcionar siempre y cuando python esté en el "path", creo, aunque no lo he probado). Invito a los interesados a que le echen un vistazo. Pueden descargárselo de: http://www.datanalytics.com/pdf/colbycol_0.1.tar.gz Puede probarse con el conjunto de datos http://www.datanalytics.com/pdf/DWH_AAPTNXACCT.zip Basta con bajar ambos ficheros, instalar el paquete, descomprimir el fichero de datos y hacer algo así como: library(colbycol) kk <- cbc.read.table( "/home/carlos/src/r/tmp_colbycol/data/DWH_AAPTNXACCT.txt", "/home/carlos/src/r/tmp_colbycol/resultados/", sep = "|", header = TRUE ) ncol(kk) nrow(kk) colnames( kk ) col.1 <- cbc.get.col( kk, 1 ) col.source <- cbc.get.col( kk, "SOURCE_SYSTEM_CD" ) Por supuesto, los caminos de los ficheros tienen que ser cambiados (y recomiendo usar caminos absolutos, no relativos). ¿Sugerencias? ¿Cree alguien que este paquete vale la pena? Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com