Pregunta

Estoy usando el analizador de expatriados para analizar un archivo XML de alrededor de 15 GB. El problema es que arroja un "Fuera de memoria". error y el programa aborta.

Quiero saber si alguien ha enfrentado un problema similar con el analizador de expatriados o es un error conocido y se ha rectificado en versiones posteriores.

¿Fue útil?

Solución

He usado expat para analizar archivos grandes antes y nunca tuve ningún problema. Supongo que estás usando SAX y no uno de los envoltorios DOM para expatriados. Si está utilizando DOM, entonces ese es su problema allí mismo: esencialmente estaría tratando de cargar todo el archivo en la memoria.

¿Está asignando objetos a medida que analiza el XML y tal vez no los desasigna? Eso sería lo primero que comprobaría. Una forma de verificar si el problema es realmente con expatriados o no: si reduce el programa a una versión simple que tenga controladores de etiquetas vacíos (es decir, simplemente analiza el archivo y no hace nada con los resultados), ¿se queda sin memoria?

Otros consejos

No conozco a expatriados en absoluto, pero supongo que tiene que mantener demasiado estado en la memoria por alguna razón. ¿El XML mal está formado de alguna manera? ¿Tiene manejadores registrados para etiquetas finales de bloques grandes?

Estoy pensando que si tienes un controlador registrado para el final de un bloque grande, y se espera que expat pase el bloque al controlador, entonces expatrt podría estar quedando sin memoria antes de que pueda reunir ese bloque por completo. . Como dije, no conozco expatriados, así que esto podría no ser posible, solo pregunto.

Alternativamente, ¿estás seguro de que el expatriado es donde está la pérdida de memoria? Me imaginaba una situación en la que guardaba cierta información sobre el contenido del archivo XML y sus propias estructuras de datos, ya sea porque los datos eran demasiado grandes o debido a fugas de memoria en su código, causaron la falta de memoria.

Expat es un analizador basado en eventos que no construye grandes estructuras en memoria. Por lo tanto, probablemente no sea el expat (que se usa mucho para analizar archivos grandes) ese es el problema; es mucho más probable que sea su propio código.

Expat tiene fugas: comencé a usarlo en un servidor de larga ejecución y descubro que siempre pierde memoria, ya sea que el analizador esté liberado o no. Las versiones más recientes de xmlparse.c no resuelven este problema, solo ocultan las fugas existentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top