2010-09-29 15 views
10

algo relacionado con: libxml2 from java¿por qué el análisis sax es más rápido que el análisis dom? y ¿cómo funciona el stax?

Sí, esta pregunta es bastante larga, lo siento. Lo guardé es tan denso como me pareció posible. Resumí las preguntas para que fuera más fácil echar un vistazo antes de leer todo el asunto.

¿Por qué el análisis sax es más rápido que el análisis dom? Lo único que se me ocurre es que con w/sax probablemente ignoras la mayoría de los datos entrantes y, por lo tanto, no pierdas el tiempo procesando partes del xml que no te importan. IOW: después de analizar w/SAX, no puede volver a crear la entrada original. Si escribiste tu analizador SAX para que representara todos y cada uno de los nodos xml (y pudieras así recrear el original), entonces no sería más rápido que DOM lo haría?

La razón por la que estoy preguntando es que estoy tratando de analizar documentos XML más rápidamente. Necesito tener acceso a todo el árbol xml DESPUÉS de analizar. Estoy escribiendo una plataforma para que los servicios de terceros se conecten, por lo que no puedo anticipar qué partes del documento xml se necesitarán y qué partes no. Ni siquiera sé la estructura del documento entrante. Es por eso que no puedo usar jaxb o sax. La huella de memoria no es un problema para mí porque los documentos xml son pequeños y solo necesito 1 en memoria a la vez. Es el tiempo que se tarda en analizar este documento xml relativamente pequeño que me está matando. No he usado el stax anteriormente, pero quizás necesito investigar más a fondo porque podría ser el punto medio. Si entiendo correctamente, stax conserva la estructura xml original y procesa las partes que solicito según demanda. De esta manera, el tiempo de análisis original puede ser rápido, pero cada vez que le pido que atraviese una parte del árbol aún no se ha cruzado, ¿es entonces cuando se lleva a cabo el procesamiento?

Si proporciona un enlace que responda la mayoría de las preguntas, aceptaré su respuesta (no tiene que responder directamente a mis preguntas si ya las ha respondido en otro lugar).

actualización: Lo reescribí en sax y analiza documentos en promedio 2,1 ms. Esta es una mejora (16% más rápido) durante los 2,5 ms que Dom estaba tomando, sin embargo, no es la magnitud que yo (y otros) habría adivinado

Gracias

+0

Diría que la pregunta de cuál es más rápido es irrelevante para sus propósitos, ya que necesita realizar consultas arbitrarias contra el árbol. Lo que significa que debe compilar una representación del árbol y tener alguna forma de crear consultas en su contra. Entonces, o usa DOM/XPath, o escribe sus propios equivalentes. – Anon

+0

Sospecho, sin embargo, que su verdadero problema no es SAX vs DOM per se, sino cómo está configurado su sistema y/o cómo está accediendo a los datos. Realmente no debería tomar tanto tiempo analizar un documento "pequeño" usando DOM (o uno de los equivalentes de DOM). ¿Has cuantificado la diferencia (que estás viendo) entre SAX y DOM? – Anon

+0

He cuantificado el enfoque DOM. documentos pequeños (aprox. 300k) xml. La implementación actual usa xerces-j y toma aproximadamente 2.5 ms por documento xml en una máquina de 1.5 GHz. para cuantificar sax depende de la cantidad de xml que elijas mantener y de lo que hagas con él. tienes razón, no creo que el sax funcionará para mí, la pregunta fue más por curiosidad. – andersonbd1

Respuesta

14

Asumiendo que no hacen más que analizar el documento, la clasificación de los diferentes estándares analizador es como sigue:

1. StAX es el más rápido

  • El evento se informó que a

2. SAX está al lado

  • Se hace todo StAX hace más el contenido se realiza de forma automática (nombre del elemento, espacio de nombres, atributos, ...)

3. DOM es la última

  • No hace todo SAX y presenta la información como una instancia de Nodo.

Su Caso de Uso

  • Si usted necesita para mantener todo el XML, DOM es la representación estándar. Se integra limpiamente con las transformaciones XSLT (javax.xml.transform), XPath (javax.xml.xpath) y las validaciones de esquema (javax.xml.validation) API. Sin embargo, si el rendimiento es clave, puede ser capaz de construir su propia estructura de árbol usando StAX más rápido que un analizador DOM podría construir un DOM.
+0

Um, ¿qué crees que sucede cuando "El evento es informado a ti" frente a "el contenido se realiza automáticamente"? – Anon

+4

StAX informará que el elemento se inició, si nunca solicita el nombre del elemento o el URI, entonces los datos no se deben realizar como objetos String. Por otro lado, un analizador SAX se dará cuenta de que los datos son objetos String como parte del evento. –

+0

Quizás. Y si me dices que has mirado las partes internas de StaX y está construido alrededor de una máquina de estado basada en caracteres, te creeré. Sin embargo, espero que genere tokens internamente, incluso si nunca los solicita. – Anon

10

DOM análisis se requiere para cargar guarde todo el documento en la memoria y luego recorra un árbol para encontrar la información que desea.

SAX solo requiere tanta memoria como necesite para IO básico, y puede extraer la información que necesita a medida que se lee el documento. Debido a que SAX está orientado a flujo, incluso puede procesar un archivo que todavía está siendo escrito por otro proceso.

+0

sí, entiendo eso. Mi pregunta era "¿por qué el sax analizador es más rápido?" no "¿cuál es la diferencia entre sax y dom?" – andersonbd1

+0

@ Stargazer712 - la respuesta de mikerobi no resolvió mi pregunta. Dudo que él/ella siquiera leyó la pregunta. Es una respuesta automática a cualquier pregunta dom/sax. Tengo una mente abierta si alguien dedica tiempo para dar una respuesta reflexiva. – andersonbd1

+2

@ andersonbd1, estoy listo para su pregunta, lamento que no haya entendido mi respuesta. Para mí, es bastante obvio que un proceso que requiere más memoria y no le dará acceso a los datos hasta que no se haya analizado por completo será más lento que un proceso que requiere muy poca memoria y le permite acceder a los datos casi tan rápido como puede ser leído. – mikerobi

10

SAX es más rápido porque los analizadores DOM a menudo usan un analizador SAX para analizar un documento internamente, luego hacen el trabajo adicional de crear y manipular objetos para representar cada nodo, incluso si la aplicación no se preocupa por ellos.

Una aplicación que utiliza SAX directamente es probable que utilice el conjunto de información de manera más eficiente que un "analizador" DOM.

StAX es un medio feliz en el que una aplicación obtiene una API más conveniente que el enfoque basado en eventos de SAX, pero no sufre la ineficacia de crear un DOM completo.

1

SAX es más rápido que DOM (normalmente cuando se lee un documento XML grande) porque SAX proporciona información como una secuencia de eventos (generalmente se accede a través de un controlador) mientras DOM crea nodos y administra la estructura de creación de nodos completamente creado (como se representa en el documento XML).

Para archivos relativamente pequeños, no sentirá el efecto (excepto que posiblemente ese proceso adicional sea realizado por DOM para crear el elemento del nodo y/o las listas de nodos).

Realmente no puedo comentar sobre StAX ya que nunca he jugado con él.

Cuestiones relacionadas