Análisis de archivos XML muy grandes mediante multiprocesamiento

Tengo un gran archivo XML, y estoy un poco perdido sobre cómo manejarlo. Son 60 GB, y necesito leerlo.

Estaba pensando si había una manera de usar el módulo de multiprocesamiento para leer el archivo de Python?

¿Alguien tiene alguna muestra de hacer esto a la que me puedan indicar?

Gracias

Para un archivo de ese tamaño, le sugiero que use un analizador XML de transmisión. En Python, este sería el método iterparse de cElementTree o lxml.etree:

http://effbot.org/zone/element-iterparse.htm

Guardar memoria analizando archivos XML muy grandes. Podría usar este código, que es un poco más nuevo que el de effbot.org, podría ahorrarle más memoria: Uso de la repetición de Python para archivos XML grandes

Multiprocesamiento / multiprocesamiento Si recuerdo correctamente, no puede realizar multiprocesamiento fácilmente para acelerar el proceso al cargar / analizar el XML. Si esta fuera una opción fácil, probablemente todos ya lo harían por defecto. En general, Python utiliza un locking de intérprete global (GIL) y esto hace que Python se ejecute dentro de un proceso y esto está vinculado a un núcleo de su CPU. Cuando se usan subprocesos, se ejecutan en el contexto del proceso principal de Python que todavía está vinculado a un solo núcleo. El uso de hilos en Python puede provocar una disminución del rendimiento debido al cambio de contexto. La ejecución de varios procesos de Python en varios núcleos brinda el rendimiento adicional esperado, pero no comparten la memoria, por lo que necesita que la comunicación entre procesos (IPC) trabaje en conjunto (puede usar el multiprocesamiento en un grupo, se sincronizan cuando se realiza el trabajo, pero Principalmente útil para (no para) tareas pequeñas que son finitas). Se requiere compartir memoria. Asumiría que todas las tareas están trabajando en el mismo XML grande. Sin embargo, LXML tiene alguna forma de trabajar alrededor de la GIL pero solo mejora el rendimiento bajo ciertas condiciones.

Subprocesos en LXML Para introducir subprocesos en lxml, hay una parte en las Preguntas frecuentes que trata sobre esto: http://lxml.de/FAQ.html#id1

¿Puedo usar hilos para acceder simultáneamente a la API lxml?

Respuesta corta: sí, si usa lxml 2.2 y versiones posteriores.

Desde la versión 1.1, lxml libera el GIL (locking global del intérprete de Python) internamente cuando se analiza desde el disco y la memoria, siempre que use el analizador predeterminado (que se replica para cada hilo) o cree un analizador para cada hilo. lxml también permite la concurrencia durante la validación (RelaxNG y XMLSchema) y la transformación XSL. Puede compartir objetos RelaxNG, XMLSchema y XSLT entre hilos.

¿Mi progtwig se ejecuta más rápido si uso hilos?

Depende. La mejor manera de responder esto es cronometrar y perfilar.

El locking global del intérprete (GIL) en Python serializa el acceso al intérprete, por lo que si la mayoría de su procesamiento se realiza en código de Python (árboles, elementos modificadores, etc.), su ganancia será cercana a cero. Sin embargo, cuanto más de su procesamiento XML se traslada a lxml, mayor será su ganancia. Si su aplicación está vinculada por el análisis y la serialización de XML, o por expresiones XPath muy selectivas y XSLT complejos, su aceleración en las máquinas con múltiples procesadores puede ser considerable.

Consulte la pregunta anterior para saber qué operaciones liberan a GIL para que sea compatible con subprocesos múltiples.

Sugerencias adicionales sobre la optimización del rendimiento para analizar XML de gran tamaño https://www.ibm.com/developerworks/library/x-hiperfparse/