www org mapwingis mapwindows mapwindow español xml delphi delphi-2009 large-files

xml - org - mapwindows 5



El manejo XML más rápido posible en Delphi para documentos muy grandes (8)

Necesito recomendaciones sobre qué usar en Delphi (uso Delphi 2009) para manejar archivos XML de gran tamaño (por ejemplo, 100 MB) lo más rápido posible.

Necesito ingresar el XML, acceder y actualizar los datos en él desde mi programa, y ​​luego exportar el XML modificado nuevamente.

Esperemos que la entrada y la salida se puedan hacer en pocos segundos en una máquina rápida de Windows.

Aclaración. Espero que necesite usar DOM, porque el acceso a la estructura de datos para desarrollar informes y hacer actualizaciones a los datos es importante, y necesito que esta funcionalidad sea muy rápida.

La entrada solo se realiza una vez para la carga de archivos y la salida solo se realiza para guardar archivos, generalmente solo una vez al salir. También deberían ser rápidos, pero no tan importantes como el acceso y la actualización de datos en memoria.

Tengo entendido que los analizadores de terceros solo ayudan con la entrada y la salida, pero no con el uso y la modificación de los datos una vez cargados en la memoria. ¿O estoy equivocado en esto?



Es posible que desee echar un vistazo al componente DIHtmlParser de The Delphi Inspiration . Se supone que es "extremadamente rápido, especialmente cuando se analizan archivos enormes", y "en las máquinas modernas el puntaje sube a más de 15 MB de datos HTML por segundo". He tenido algunas experiencias bastante buenas con él, aunque nunca lo he intentado con archivos enormes.


Estoy muy satisfecho con NativeXML de SimDesign. También incluye una versión especial llamada FastXML, que aún no probé, pero me dicen que sea, bueno, rápido.


No soy especialista, pero creo que el consenso es que un analizador SAX será mucho más eficiente que DOM ...


SAX vale la pena considerar en lugar de un analizador DOM.

Con DOM, usted paga los gastos generales de cargar el documento, pero una vez que se cargan, se puede acceder y actualizar rápidamente.

Con SAX tienes que escribir controladores para el elemento inicial, elemento final, etc., pero tienes mucha más flexibilidad en lo que haces a medida que avanzas.

Aunque probablemente no ayude a su situación, SAX es muy útil en las búsquedas porque puede detener el análisis en cualquier momento, por lo que una vez que haya encontrado lo que desea, podrá detenerlo.

Si su programa no necesita haber analizado todos los datos antes de que sepa qué cambios realizar, podría escribir manejadores de SAX que simplemente actualicen los datos cuando se leyeron y pasen de otra manera, para que transmitan los datos en lugar de tener que cargar todo en cualquier tipo de estructura de memoria. Esto haría que la solución sea muy escalable ya que no afectará las limitaciones de memoria con archivos muy grandes.

Por lo que vale, tiendo a usar los analizadores MSXML DOM y SAX. Se puede argumentar que no son los de mejor rendimiento, sostengo que probablemente haya más personas trabajando para mejorarlos, de modo que mejorarán cada vez más.


Otra posibilidad que acabo de descubrir es que con el paquete LMD ElPack que compré, incluyen una biblioteca de soporte XML que dicen "es extremadamente rápida, totalmente habilitada para Unicode y agrega solo una pequeña huella a sus archivos Exe".

Al observar la fuente de su unidad LMDXML.pas incluida en el paquete LMD 7 (para Delphi 2009), dice que el código se basa en el código SimpleXML Versión 8.0 (julio de 2006) de Michail Vlasov.


Si entendí su pregunta correctamente, tiene una estructura de datos conocida y está modificando los datos, no la estructura XML del archivo.

En estas condiciones y si el rendimiento es crucial , puede intentar con la manipulación directa de texto: omita el análisis XML.

Lea de la secuencia, use algún algoritmo de búsqueda de texto rápido, por ejemplo, Boyer-Moore , para buscar lugares donde necesite modificar datos, realizar modificaciones y generar datos en otra transmisión.

Esto sería de una sola pasada, sin análisis XML, sin creación de árbol XML en memoria.


Si solo necesita manipulación directa, estaría de acuerdo con la respuesta de zendar.

En cuanto a la implementación de DOM o SAX, recomendaría DIXml .