2017-03-23 4 views
0

Pouvez-vous s'il vous plaît par exemple s'il ya un moyen d'analyser un fichier XML (size = 600M) avec unstagle/python En fait j'utilise untangle.parse (fichier.xml) et j'ai un message d'erreur : Processus terminé avec le code de sortie 137Parsing Huge fichiers XML avec 600M

Y a-t-il un moyen d'analyser ce fichier par bloc par exemple ou une autre option utilisée par la fonction untangle.parse() ou une configuration linux spécifique ...?

Merci

+0

Le code de sortie 137 est le résultat d'un SIGKILL. – Vallentin

+0

Vous pourriez jeter un oeil sur Belle soupe. Leur analyseur lxml est très rapide, et dans un système moderne (4 Go + RAM) vous ne devriez avoir aucun problème à analyser un fichier de 600 Mo. – Mikael

Répondre

0

Vous pouvez utiliser modules xmlsax (Simple API for XML) analyseur.

SAX est un contexte streaming sur XML et le document est traité dans la mode linéaire.

Ceci est avantageux lorsque arbre DOM consomme trop de mémoire implémentations habituelles DOM utilisent 10 octets de mémoire pour représenter 1 octet de XML.

Exemple de code pour faire un peu comme ceci:

import xml.sax 


def stream_gz_decompress(stream) : 
    dec = zlib.decompressobj(32 + zlib.MAX_WBITS) 
    for chunk in stream : 
     rv = dec.decompress(chunk) 
     if rv : 
      yield rv 

class stream_handler(xml.sax.handler.ContentHandler) : 

    last_entry = None 
    last_name = None 


    def startElement(self, name, attrs) : 
     self.last_name = name 
     if name == 'item': 
      self.last_entry = {} 
     elif name != 'root' and name != 'updated' : 
      self.last_entry[name] = {'attrs': attrs, 'content': ''} 

    def endElement(self, name): 

     if name == 'item': 

      # YOUR APPLICATION LOGIC GOES HERE 

      self.last_entry = None 
     elif name == 'root': 
      raise StopIteration 

    def characters(self, content): 
     if self.last_entry: 
      self.last_entry[self.last_name]['content'] += content 



parser = xml.sax.make_parser() 
parser.setContentHandler(stream_handler()) 
with open(os.path.basename('FILENAME'), "rb") as local_file: 
    for data in stream_gz_decompress(local_file): 
      parser.feed(data) 
-1

Il est possible d'utiliser le saxophone avec Démêler ?, dire que je charge le fichier par sax et lu par Démêler, parce que j'ai beaucoup de code écrit en utilisant untagle et j'ai développé depuis longtemps, et je ne veux pas recommencer à zéro Merci

+0

pas une réponse. Devrait être supprimé et mis en commentaire – jaromrax