IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Parsing XML trop lent


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut Parsing XML trop lent
    Bonjour,

    je souhaite parser des fichiers XML « pesant » plusieurs Go pour en extraire les informations et les insérer dans une base de données.

    Pour cela, j'avais utilisé SAX, mais il me faut plusieurs heures pour parser un fichier d'une centaine de Mo environ (à noter que la base est sur la même machine, ce qui baisse un peu les performances).

    Un telle lenteur étant rédhibitoire, il va me falloir trouver une autre solution. Je pensais utiliser des expression régulières et lire mes fichiers ligne par ligne : puis-je m'attendre à avoir de meilleures performances ?
    Y a-t-il éventuellement une meilleure solution pour un parsing « brut » de données XML ?

    Merci pour vos réponses et bon week-end !

    Alban

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    tu peux regarder du côté du module cElementTree dont le benchmarck est impressionnant....

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Bon j'ai une question dans la question
    Qu'est-ce que parser un fichier ? D'après ce que j'ai trouvé/compris, c'est le parcourir avec un curseur pour en extraire des données. J'ai bon ?

    Python offre des modules qui permettent de lire les fichiers XML. Tu trouves ça ici : http://quilovnic.developpez.com/pythondom/
    Ceci dit, si SAX était trop lent (avec Java, c'est ça ?), je ne sais pas si ça vaut le coup d'essayer.

    Sinon, compare un essai avec l'API DOM, un avec une lecture ligne par ligne, et un avec une lecture caractère par caractère en mesurant le temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from time import time
    debut = time()
    (essai)
    fin = time()
    print (debut-fin)
    Ta lecture caractère par caractère pourrait être une boucle, avec des tests imbriqués. Tu lis le fichier caractère par caractère en ignorant les espaces et les tab. Quand il arrive à une balise, il l'examine, et si tu n'es pas à la bonne, il ignore automatiquement tout ce qui suit jusqu'à la balise de fermeture.
    En gros, tu ne fais que lire les balises, et sauter de l'une à l'autre.

    J'espère que ça pourra t'aider. En tout cas, si tu trouves une réponse par ailleurs à ce problème, je suis très intéressé.


    ##
    Christophe

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut
    pacificator > En effet, cElementTree a l'air intéressant ! Je vais essayer de voir comment ça fonctionne. Merci
    (même si j'ai un peu peur que ça reste trop lent... )

    _christophe_ > On a bien la même définition du parsing
    En fait, je travaillais déjà en Python (SAX a également été implémenté pour ce langage).
    Par contre, DOM n'est pas utilisable dans mon cas : il impose de charger le fichier intégralement en mémoire... ce qui n'est pas possible avec des fichiers de 3 ou 4 Go (d'autant que, pour travailler sur le fichier, il faut un espace mémoire nettement plus important que la taille « brute » du fichier).
    Cependant, je retiens ton conseil de mesurer le temps : ça m'évitera d'en perdre à utiliser des méthodes vraiment trop lentes !

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut
    Je reviens plus d'un an après (un peu à froid) sur le sujet en faisant du ménage.

    Niveau performances, ce n'était pas le parseur qui posait problème mais les insertions en base.
    Ce que je faisais :

    1. parsing des données suffisantes pour générer UNE requête ;
    2. exécution des requêtes pour vérifier que les données ne sont pas déjà en base ;
    3. exécution de la requête.

    Au final, quitte à conserver les requêtes de vérification pendant le parsing (et encore...), générer un gros fichier texte qui contient toutes les requêtes le "balancer" dans la BdD d'un coup est beaucoup plus performant.

    Ca demande un peu plus d'espace libre sur le disque mais on y gagne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convolution trop lente...
    Par progfou dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 05/08/2006, 11h44
  2. [JSP] Parsing XML avec JDOM
    Par benben13 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 26/08/2005, 17h19
  3. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo