Estoy explorando cambiar a python y pandas como usuario de SAS desde hace mucho tiempo.
Sin embargo, al ejecutar algunas pruebas hoy, me sorprendió que Python se quedara sin memoria al intentar pandas.read_csv()
un archivo csv de 128 MB. Tenía alrededor de 200.000 filas y 200 columnas de datos en su mayoría numéricos.
Con SAS, puedo importar un archivo csv a un conjunto de datos SAS y puede ser tan grande como mi disco duro.
¿Hay algo análogo en pandas
?
Regularmente trabajo con archivos grandes y no tengo acceso a una red informática distribuida.
Respuestas:
En principio, no debería quedarse sin memoria, pero actualmente hay problemas de memoria con
read_csv
archivos grandes causados por algunos problemas internos complejos de Python (esto es vago pero se conoce desde hace mucho tiempo: http://github.com/pydata / pandas / issues / 407 ).Por el momento no hay una solución perfecta (aquí hay una tediosa: podría transcribir el archivo fila por fila en una matriz NumPy preasignada o un archivo mapeado en memoria
np.mmap
), pero es una en la que estaré trabajando en un futuro próximo. Otra solución es leer el archivo en partes más pequeñas (usariterator=True, chunksize=1000
) y luego concatenarlo conpd.concat
. El problema surge cuando almacena todo el archivo de texto en la memoria de una sola vez.fuente
¡Wes tiene razón, por supuesto! Solo estoy interviniendo para proporcionar un código de ejemplo un poco más completo. Tuve el mismo problema con un archivo de 129 Mb, que fue resuelto por:
fuente
df = concate(tp, ignore_index=True)
?AssertionError: first argument must be a list-like of pandas objects, you passed an object of type "TextFileReader"
. ¿Alguna idea de lo que está pasando aquí?pd.concat(list(tp), ignore_index=True)
Este es un hilo más antiguo, pero solo quería descargar mi solución alternativa aquí. Inicialmente probé el
chunksize
parámetro (incluso con valores bastante pequeños como 10000), pero no ayudó mucho; todavía tenía problemas técnicos con el tamaño de la memoria (mi CSV era ~ 7.5 Gb).En este momento, solo leo fragmentos de los archivos CSV en un enfoque de bucle for y los agrego, por ejemplo, a una base de datos SQLite paso a paso:
fuente
pandas.read_csv
devuelve directamente (al menos en la versión que estoy usando actualmente) un iterador si simplemente proporcionaiterator=True
ychunksize=chunksize
. Por lo tanto, solo haría unfor
bucle sobre lapd.read_csv
llamada, en lugar de volver a crear una instancia cada vez. Sin embargo, esto solo cuesta los gastos generales de la llamada, es posible que no haya un impacto significativo.iterator=True
ychunksize
ya existían en ese entonces si no recuerdo mal. Tal vez hubo un error en una versión anterior que causó la explosión de la memoria; lo intentaré de nuevo la próxima vez que lea un DataFrame grande en Pandas (ahora estoy usando principalmente Blaze para tales tareas)A continuación se muestra mi flujo de trabajo.
Según el tamaño de su archivo, será mejor que optimice el tamaño del fragmento.
Después de tener todos los datos en la base de datos, puede consultar los que necesita de la base de datos.
fuente
Si desea cargar archivos csv enormes, dask podría ser una buena opción. Imita la API de pandas, por lo que se siente bastante similar a los pandas
enlace a dask en github
fuente
Puede usar Pytable en lugar de pandas df. Está diseñado para grandes conjuntos de datos y el formato de archivo está en hdf5. Entonces, el tiempo de procesamiento es relativamente rápido.
fuente