2011-08-07 20 views
6

¿Existe alguna manera de combinar el uso de scan() y read.big.matrix() del paquete bigmemory para leer en un archivo .csv de 200 MB? archivo con columnas de tipo mixto para que el resultado sea un marco de datos con entero, carácter y columnas numéricas?Cómo cargar un archivo csv grande con columnas de tipo mixto usando el paquete bigmemory

+1

¿tiene que ser el paquete bigmemory?Encuentro mucho más útil para este tipo de cosas – mdsumner

+0

@mdsumner está en el camino correcto. ¿Incluso necesita ser respaldado por archivos? Por 200 MB, acabo de leerlo, trabajar con él y luego guardarlo como 1 o más archivos BM (o en 'ff', si lo desea). – Iterator

Respuesta

3

De acuerdo con el archivo de ayuda, no.

Los archivos deben contener solo un tipo atómico (todo entero, por ejemplo). Usted, el usuario, debe saber si su archivo tiene nombres de fila y/o columna , y varias combinaciones de opciones deberían ser útiles en para obtener el comportamiento deseado.

No conozco este paquete/función, pero en R, las matrices solo pueden tener un tipo atómico (a diferencia de data.frames).

+0

Gracias por sus dos centavos. En este blog, http://joshpaulson.wordpress.com/2010/12/20/michael-kane-on-bigmemory/ alguien sugirió que una solución a la limitación de matrices que tienen un solo tipo atómico (una característica heredada por grande. matriz) es usar scan(). Esperaba que alguien pudiera compartir sus experiencias con read.big.matrix del paquete bigmemory, especialmente con respecto a la lectura en columnas de tipo mixto y si han usado scan(). – Lourdes

+0

Quizás pueda hacer eso en la etapa de procesamiento, pero me gustaría que se demuestre que está equivocado (sensu @Iterator). –

9

Pruebe el paquete ff para esto.

library(ff) 
help(read.table.ffdf) 

Función ‘read.table.ffdf’ lee los archivos planos separados en ‘ffdf’ objetos, muy parecido (y usar) ‘read.table’. También puede trabajar con con cualquier envoltorio de conveniencia como 'read.csv' y proporciona su propia envoltura de conveniencia (por ejemplo, 'read.csv.ffdf') para las envolturas habituales de de R.

Para 200Mb debería ser una tarea tan simple como esta.

x <- read.csv.ffdf(file=csvfile) 

(Para los archivos mucho más grandes que probablemente se necesitará que investigue algunas de las opciones de configuración, dependiendo de su máquina y sistema operativo).

+0

Gracias mdsummer. Probé el paquete ff, pude leer en el conjunto de datos de casi 300 MB que guardé en un objeto que luego coaccioné en un marco de datos con .data.frame. Sin embargo, esto consumió tanta memoria que quedaba poco para el análisis. Sin embargo, fue un buen comienzo y una sugerencia útil. – Lourdes

+0

El punto entero no es cargarlo todo, sino usar las características mapeadas en memoria del paquete ff. Hay herramientas para extraer partes de las estructuras de datos ff – mdsumner

6

Ah, hay algunas cosas que son imposibles en esta vida, y hay algunas que son malentendidas y que conducen a situaciones desagradables. @Roman tiene razón: una matriz debe ser de un tipo atómico. No es un marco de datos.

Dado que una matriz debe ser de un tipo, intentar el snooker bigmemory para manejar varios tipos es, en sí mismo, algo malo. ¿Podría hacerse? No voy a ir allí. ¿Por qué? Porque todo lo demás supondrá que está obteniendo una matriz, no un marco de datos. Eso llevará a más preguntas y más tristeza.

Ahora, lo que puede hacer es identificar los tipos de cada una de las columnas y generar un conjunto de archivos de bigmemory distintos, cada uno con los elementos que son de un tipo particular. P.ej. charBM = matriz grande de caracteres, intBM = matriz grande entera, y así sucesivamente. Entonces, es posible que pueda desarrollar una envoltura que produzca un marco de datos de todo esto. Sin embargo, no lo recomiendo: tratar los diferentes elementos como lo que son, o forzar la homogeneidad si se puede, en lugar de tratar de producir un grifo de gran marco de datos.

@mdsumner es correcto al sugerir ff. Otra opción de almacenamiento es HDF5, a la que puede acceder a través del ncdf4 en R. Desafortunadamente, estos otros paquetes no son tan agradables como bigmemory.

+0

Gracias Iterator. Tienes razón, los otros paquetes no son tan agradables como bigmemory. – Lourdes

0

La mejor solución es leer el archivo línea por línea y analizarlo, de esta manera el proceso de lectura ocupará una cantidad de memoria casi lineal.

+0

¡Bienvenido a StackOverflow! Sin embargo, esto no responde a la pregunta, que estaba específicamente dirigida al paquete bigmemory –

Cuestiones relacionadas