• Martes 19 de Noviembre de 2024, 15:35

Autor Tema:  Procesamiento de XML con PYTHON  (Leído 5824 veces)

sonrisitas

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Procesamiento de XML con PYTHON
« en: Miércoles 24 de Septiembre de 2008, 18:56 »
0
Hola!, les cuento cual es el problema...
Necesito procesar un archivo xml de 500 MB en python, leyendo en la web encontre que libxml2 era apto para cosas grandes. Pero no es asi... ya que en una maquina con 2 G no lo puede procesar, y en un cluster demora 6 horas, necesito urgente si alguien conoce que puedo usar para que no ocupe tanta memoria y para que termine rapido.
Gracias!

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Procesamiento de XML con PYTHON
« Respuesta #1 en: Miércoles 24 de Septiembre de 2008, 23:09 »
0
Puedes abrir el archivo por cantidad de bytes con el método read(cantidad de bytes) ir leyendolo hasta alcanzar el final del fichero, con un ciclo lo podrías llevar hasta el final, algo así:
Código: Python
  1. import os
  2. h = os.path.getsize('file.xml') #Se obtiene el tamaño del archivo
  3. f = open('file.xml', 'r')
  4. x = 0
  5. while x < h:
  6.     f.read(512) #Se va leyendo por cantidad de bytes para no hacer tan pesada la consulta
  7.     x += 512
  8.  
  9.  
Ojala te sirva.
Chao
El pasado son solo recuerdos, el futuro son solo sueños

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Procesamiento de XML con PYTHON
« Respuesta #2 en: Jueves 25 de Septiembre de 2008, 01:04 »
0
Obviamente la respuesta de Edo no es valida, ya que hacer un parser de XML es un trabajo largo y dificil, y es aun mas dificil cuando tienes que leer bloques de bytes para formar los arboles.

Para ficheros muy grandes, existe SAX (Java) o XML::Twing (Perl) para desarrollo rapido... pero si quieres que el procesamiento sea el mas optimo (en velocidad) lo mejor es libxml (para C) o libxslt (C + Gnome).

El problema es que Python es un poco lento (mas lento que Perl, ya que Python no precompila el codigo como Perl lo hace) y todos los scripts en jeneral... en resumen, lo mejor seria usar C/C++

PD: Espero que no estes usando Windows (los scripts tienden a ser mas lentos).
PD2: Edo, la memoria leida no deberia ser de 512, es muy poquito... deberia ser, al menos, 2Kb  :P
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Procesamiento de XML con PYTHON
« Respuesta #3 en: Jueves 25 de Septiembre de 2008, 07:40 »
0
Cita de: "sonrisitas"
Hola!, les cuento cual es el problema...
Necesito procesar un archivo xml de 500 MB en python, leyendo en la web encontre que libxml2 era apto para cosas grandes. Pero no es asi... ya que en una maquina con 2 G no lo puede procesar, y en un cluster demora 6 horas, necesito urgente si alguien conoce que puedo usar para que no ocupe tanta memoria y para que termine rapido.
Gracias!

Yo tuve el mismo problema hace un tiempo atras, por lo tanto te voy a comentar mi experiencia.

Los archivos xml que tenia que procesar eran de alrededor de 200MB y cuando los procesaba me consumian mucha memoria.
Despues de investigar note que hay diferentes formas de parsear un xml. Seguramente lo que te esta ocurriendo es lo mismo que me ocurrio a mi, yo utilice DOM[1] para procesar el xml.
El problema es que DOM para procesar el archivo genera un modelo de objetos a partir del xml, por lo tanto en mi caso iba a utilizar mas de 200MB para poder armar el modelo en memoria.
Buscando ayuda encontre otra alternativa llamada SAX[2]. Este en vez de cargar todo en memoria utiliza una api event-driven, que llama metodos segun se abra o cierre un tag.
Por lo tanto SAX podria ser la solucion para tu problema. Aca pongo un ejemplo que es bastante auto explicativo, espero te sirva.

Código: Text
  1. import sys
  2.  
  3. from xml.sax import make_parser, handler
  4.  
  5. class FancyCounter(handler.ContentHandler):
  6.  
  7.     def __init__(self):
  8.         self._elems = 0
  9.         self._attrs = 0
  10.         self._elem_types = {}
  11.         self._attr_types = {}
  12.  
  13.     def startElement(self, name, attrs):
  14.         self._elems = self._elems + 1
  15.         self._attrs = self._attrs + len(attrs)
  16.         self._elem_types[name] = self._elem_types.get(name, 0) + 1
  17.  
  18.         for name in attrs.keys():
  19.             self._attr_types[name] = self._attr_types.get(name, 0) + 1
  20.  
  21.     def endDocument(self):
  22.         print "There were", self._elems, "elements."
  23.         print "There were", self._attrs, "attributes."
  24.  
  25.         print "---ELEMENT TYPES"
  26.         for pair in  self._elem_types.items():
  27.             print "%20s %d" % pair
  28.  
  29.         print "---ATTRIBUTE TYPES"
  30.         for pair in  self._attr_types.items():
  31.             print "%20s %d" % pair
  32.  
  33.            
  34. parser = make_parser()
  35. parser.setContentHandler(FancyCounter())
  36. parser.parse(sys.argv[1])
  37.  
  38.  


Saludos

nrm

[1] - http://en.wikipedia.org/wiki/Document_Object_Model
[2] - http://en.wikipedia.org/wiki/Simple_API_for_XML

NRM

  • Miembro MUY activo
  • ***
  • Mensajes: 279
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.narrowmind.com.ar
Re: Procesamiento de XML con PYTHON
« Respuesta #4 en: Jueves 25 de Septiembre de 2008, 07:53 »
0
Cita de: "su -"
El problema es que Python es un poco lento (mas lento que Perl, ya que Python no precompila el codigo como Perl lo hace) y todos los scripts en jeneral... en resumen, lo mejor seria usar C/C++

En esta pagina[1] tenes informacion sobre el tema de la compilacion de los modulos de python.
Si el problema es la performance se puede extender python utilizando C[2], solo para tener otra opcion.
Esta otra[3] tiene un benchmark sobre ambos lenguajes.

Saludos

nrm

[1] - http://docs.python.org/tut/node8.html#S ... 0000000000
[2] - http://www.python.org/doc/ext/intro.html
[3] - http://shootout.alioth.debian.org/gp4/python.php

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re: Procesamiento de XML con PYTHON
« Respuesta #5 en: Jueves 25 de Septiembre de 2008, 14:49 »
0
Cita de: "su -"
Obviamente la respuesta de Edo no es valida, ya que hacer un parser de XML es un trabajo largo y dificil, y es aun mas dificil cuando tienes que leer bloques de bytes para formar los arboles.
Yo solo decía, la vaina es que lo dijé por que lo probé con un archivo de 700MB con el que tenía que trabajar y me funciono así, por eso hicé el ejemplo, no era XML era un simple archivo de texto; que bueno es aprender cosas nuevas
Cita de: "su -"
PD2: Edo, la memoria leida no deberia ser de 512, es muy poquito... deberia ser, al menos, 2Kb  :P
Era simplemente un ejemplo

Creo que con la info de NRM queda bien explicado.
El pasado son solo recuerdos, el futuro son solo sueños

sonrisitas

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Procesamiento de XML con PYTHON
« Respuesta #6 en: Viernes 26 de Septiembre de 2008, 04:13 »
0
Gracias!, acabo de probar el ej con sax... parece andar bastante rapido... voy a ver como lo adapto. Gracias! :hola:

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Procesamiento de XML con PYTHON
« Respuesta #7 en: Miércoles 1 de Octubre de 2008, 22:41 »
0
Cita de: "NRM"
Cita de: "su -"
El problema es que Python es un poco lento (mas lento que Perl, ya que Python no precompila el codigo como Perl lo hace) y todos los scripts en jeneral... en resumen, lo mejor seria usar C/C++

En esta pagina[1] tenes informacion sobre el tema de la compilacion de los modulos de python.
Si el problema es la performance se puede extender python utilizando C[2], solo para tener otra opcion.
Esta otra[3] tiene un benchmark sobre ambos lenguajes.

Saludos

nrm

[1] - http://docs.python.org/tut/node8.html#S ... 0000000000
[2] - http://www.python.org/doc/ext/intro.html
[3] - http://shootout.alioth.debian.org/gp4/python.php

Perdon por la demora...  :whistling:
Link 1: Muy interesante, pero en Perl puede usar Inline::C, Inline::ASM, Inline::Python :devil:  
Link 2: Como en todos los lenguajes script (bueno, casi todos) y esto, en efecto es la solucion a muchos problemas de memoria.
Link 3: Muy malo.
Para empezar, usa perl 5.8.8 (Frebrero del 2006) y Python 2.5.1 (Abril 18 del 2007) lo cual no es justo  :P .
Ademas no vi los codigos que usan... asi que... ni modo.
Citar
Yo solo decía, la vaina es que lo dijé por que lo probé con un archivo de 700MB con el que tenía que trabajar y me funciono así, por eso hicé el ejemplo, no era XML era un simple archivo de texto; que bueno es aprender cosas nuevas
Bien, entiedo.
Yo hice lo mismo con perl 5.8.0, en BeOS R5  y con un archivo de 1.8 GB... el trabajo era partirlo en 3 partes (todas del mismo tamaño) y tomo unos 20 minutos y 41 segundos... usando un buffer de 1024 bytes (muy poco).
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.