python - txt - gran cantidad de datos en muchos archivos de texto: ¿cómo procesarlos?
guardar archivos de texto en python (8)
Con terabytes, querrás paralelizar tus lecturas en muchos discos de todos modos; así que podría ir directamente a Hadoop.
Use Pig o Hive para consultar los datos; ambos tienen un amplio soporte para transformaciones definidas por el usuario, por lo que debería poder implementar lo que necesita hacer usando un código personalizado.
Tengo grandes cantidades de datos (unos pocos terabytes) y acumulando ... Están contenidos en muchos archivos de texto plano delimitados por tabuladores (cada uno de aproximadamente 30 MB). La mayor parte de la tarea implica leer los datos y agregar (sumando / promediando + transformaciones adicionales) sobre las observaciones / filas basadas en una serie de declaraciones de predicados, y luego guardar la salida como archivos de texto, HDF5 o SQLite, etc. Normalmente uso R para tales tareas, pero me temo que esto puede ser un poco grande. Algunas soluciones candidatas son para
- escribe todo en C (o Fortran)
- importar los archivos (tablas) en una base de datos relacional directamente y luego extraer fragmentos en R o Python (algunas de las transformaciones no son aptas para soluciones SQL puras)
- escribe todo en Python
¿Sería (3) una mala idea? Sé que puede ajustar las rutinas C en Python, pero en este caso, dado que no hay nada computacionalmente prohibitivo (p. Ej., Rutinas de optimización que requieren muchos cálculos iterativos), creo que la E / S puede ser un cuello de botella tan importante como el cálculo. ¿Tiene alguna recomendación sobre consideraciones o sugerencias adicionales? Gracias
Editar Gracias por tus respuestas. Parece haber opiniones contradictorias sobre Hadoop, pero en cualquier caso no tengo acceso a un clúster (aunque puedo usar varias máquinas sin red) ...
Cuando dice "acumulando", la solución (2) parece más adecuada para el problema.
Después de la carga inicial en la base de datos, solo actualiza la base de datos con archivos nuevos (¿diariamente, semanalmente? Depende de la frecuencia con que lo necesite).
En los casos (1) y (3), necesita procesar los archivos cada vez (lo que se indicó anteriormente como la mayor parte del tiempo / consumo de recursos), a menos que encuentre una forma de almacenar los resultados y actualizarlos con nuevos archivos.
Puede usar R para procesar archivos de csv a, por ejemplo, la base de datos SQLite.
Eche un vistazo a Disco . Es un motor MapReduce ligero distribuido, escrito en aproximadamente 2000 líneas de Erlang, pero diseñado específicamente para el desarrollo de Python. Admite no solo trabajar en sus datos, sino también almacenar una replicación de manera confiable. Acaban de lanzar la versión 0.3, que incluye una capa de indexación y base de datos.
En caso de que tenga un grupo de máquinas, puede paralelizar su aplicación utilizando Hadoop Mapreduce. Aunque Hadoop está escrito en Java, también puede ejecutar Python. Puede consultar el siguiente enlace para ver los indicadores al paralelizar su código: PythonWordCount
He tenido suerte usando R con Hadoop en Amazon''s Elastic Map Reduce. Con EMR pagas solo por el tiempo de la computadora que usas y AMZN se encarga de girar y girar las instancias. Exactamente cómo estructurar el trabajo en EMR realmente depende de cómo está estructurado su flujo de trabajo de análisis. Por ejemplo, ¿todos los registros necesarios para un trabajo están completamente dentro de cada csv o necesita bits de cada csv para completar un análisis?
Aquí hay algunos recursos que pueden serle útiles:
- Pete Skomoroch hablando sobre R y AMZN EMR en el foro de discusión AMZN
- La publicación de mi blog sobre cómo comenzar con R y AMZN EMR
- El proyecto Rhipe tiene como objetivo integrar R y Hadoop. Rhipe no está enfocado en EMR, sin embargo, así que no lo he usado todavía. Parece que debe ser puenteable a EMR, sin embargo.
El problema que mencioné en mi publicación de blog es más de estar vinculado a la CPU, no a IO. Sus problemas son más IO, pero los consejos para cargar bibliotecas y archivos caché pueden ser útiles.
Si bien es tentador tratar de meterlo dentro / fuera de una base de datos relacional, recomiendo considerar cuidadosamente si realmente necesita todos los gastos generales de un RDB. Si no lo hace, puede crear un cuello de botella y un desafío de desarrollo sin una recompensa real.
Ok, entonces para ser diferente, ¿por qué no R?
- Parece que conoce R, por lo que puede obtener un código de trabajo rápidamente
- 30 mb por archivo no es grande en la estación de trabajo estándar con unos pocos GB de RAM
- la variante
read.csv()
deread.table()
puede ser muy eficiente si especifica los tipos de columnas mediante el argumentocolClasses
: en lugar de los tiposcolClasses
para la conversión, estos se manejarán de manera eficiente - el cuello de botella aquí es I / O del disco y eso es lo mismo para cada idioma
- R tiene multicore para configurar el procesamiento paralelo en máquinas con núcleo múltiple (similar al multiprocesamiento de Python, al parecer)
- Si desea emplear la estructura "vergonzosamente paralela" del problema, R tiene varios paquetes que son adecuados para problemas paralelos a los datos: por ejemplo, snow y foreach pueden implementarse en una sola máquina o en un conjunto de máquinas conectadas en red. .
Sí. ¡Tienes razón! La E / S costaría la mayor parte de su tiempo de procesamiento. No sugiero que use sistemas distribuidos, como hadoop, para esta tarea.
Su tarea podría hacerse en una modesta estación de trabajo. No soy un experto en Python, creo que tiene soporte para programación asincrónica. En F # / .Net, la plataforma tiene soporte para eso. Una vez estaba haciendo un trabajo de procesamiento de imágenes, cargar imágenes de 20K en el disco y transformarlas en vectores de características solo cuesta varios minutos en paralelo.
en definitiva, cargue y procese sus datos en paralelo y guarde el resultado en la memoria (si es pequeña), en la base de datos (si es grande).
(3) no es necesariamente una mala idea: Python hace que sea más fácil procesar el archivo "CSV" (ya pesar de que la pestaña C para Coma, ya que un separador es igual de fácil de manejar) y, por supuesto, obtiene casi el mismo ancho de banda en operaciones de E / S como cualquier otro idioma. En cuanto a otras recomendaciones, numpy
, además de la computación rápida (que puede que no necesite de acuerdo con sus declaraciones) proporciona arreglos multidimensionales muy prácticos y flexibles, que pueden ser bastante útiles para sus tareas; y el multiprocessing
módulos de biblioteca estándar le permite explotar múltiples núcleos para cualquier tarea que sea fácil de paralelizar (importante ya que casi todas las máquinas en estos días tienen múltiples núcleos ;-).