¿Qué tamaño de file XML debe considerarse demasiado grande para un analizador DOM?

He estado desarrollando una aplicación bastante simple para iOS y Android que analiza xml local para formar lists de artículos y mostrar información sobre ellos. Al analizar mis opciones de análisis, me conformé con el analizador SAX nativo para Android, así como con la class NSXMLparser incorporada al objective-C. Al mirar mis opciones, vi repetidamente a la gente diciendo que los analizadores DOM no son adecuados para files grandes xml. Sin embargo, nadie definió exactamente lo que significaba "grande". En una versión posterior de la aplicación, estoy pensando en cambiar a un analizador DOM.

Mi pregunta es: ¿Dónde dibujas la línea y eliminan los analizadores DOM como una opción? Las plataforms en cuestión son iOS y Android, las cuales, por supuesto, todavía tienen muchos dispositivos antiguos flotando. Entonces, suponiendo un dispositivo más lento que el promedio, ¿dónde se dibuja la línea?

Gracias por su consideración.

Los analizadores DOM tienen que cargar todo el XML en la memory. Además, es típico que el XML analizado ocupe una memory de 5x-10x en comparación con el tamaño del XML original.

Si sabe que el consumo de memory permitido de su aplicación es decir N megabytes de RAM, entonces puede dibujar esa línea usted mismo: divida N por 10.

Por ejemplo, si no desea pasar más de 10 MB de RAM, su XML no debe superar los 1 MB.

Solo los dispositivos más recientes tienen 1GB de RAM (divididos entre todas las aplicaciones), los dispositivos más antiguos tenían 512MB e incluso 256MB. 256 MB / 10 = 25 MB. Probablemente no quiera comer más del 10% de toda la memory, por lo que cualquier cosa de más de 2.5MB para DOM XML compatible con todas las plataforms es demasiado.

Pero, esta es solo una regla empírica, y solo la testing de la vida real puede decirte la verdad.

¿Qué es demasiado grande? Es una function de la cantidad de memory de trabajo que tiene, que variará según el dispositivo. En los iPhones, en un 3GS, solo tiene 256MB, el iPhone 4 tiene 512MB y el iPhone 5 tiene 1GB.

Por cierto, mientras que NSXMLParser es un analizador SAX, si usa initWithContentsOfURL , carga toda la alimentación en la memory antes de que comience el análisis. Por lo tanto, sufre un intenso consumo de memory similar a DOM, pero con una engorrosa interfaz tipo SAX. Como resultado, si miras el ejemplo de PerformanceXML de Apple, cuando ilustran un analizador de SAX de flujo de tamaño pequeño, LibXML2 a LibXML2 , que se transmite bien. Cuando uso NSXMLParser , también he logrado un efecto similar envolviendo mi NSURLConnection en un NSInputStream y, por lo tanto, puedo llamar a initWithStream y disfrutar de NSXMLParser con una pequeña huella de memory que permiten los analizadores SAX.

En resumen, al analizar files XML realmente grandes, asegúrese de que su analizador SAX aún no consume memory de forma extravagante, pero utilice LibXML2 o use NSXMLParser con un NSInputStream .

Para mí, y esto es completamente arbitrario, si el XML es mucho más de 1 MB, LibXML2 analizador SAX de transmisión LibXML2 . Si fuera tan grande, no utilizaría un analizador DOM, ni utilizaría NSXMLParser .

Vea también Cómo elegir el mejor analizador XML de Ray Wenderlich para su proyecto de iPhone