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 :

[3.4.3] Performances variables sur du parsing de masse de XML avec cElementTree [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut [3.4.3] Performances variables sur du parsing de masse de XML avec cElementTree
    Bonjour,

    j'utilise Python 3.4.3 avec cElementTree pour parser en masse des centaines de milliers de XML qui sont sur mon disque dur puis les intégrer dans une BDD Oracle.

    Les performances sont tout à fait acceptables (voire formidables) par contre elles sont TRES variables. La BDD n'est pas en cause, j'ai pointé les temps à chaque étape et ce qui varie (visiblement) c'est:
    - l'ouverture d'un fichier : boucle dans UN répertoire avec os.walk
    - son parsing (avec la fonction ET.parse),
    - la récupération des données (avec des boucles ou des find, pas vu de réelle différence)
    - et sa fermeture (naturellement réalisée avec un WITH)

    La performance peut aller de 2300 xml/s à seulement 220 xml/s. Le point important c'est que je fais mes tests sur les mêmes XML à chaque fois, le même poste, la même BDD (mais de toutes façons cette partie là est stable), bref exactement la même configuration. A l'instant je viens d'avoir 2 runs à 3mn d'écart, le 1er à 220 xml/s et le 2e à 2300 xml/s.

    Qu'est-ce qui, selon vous, pourrait provoquer ce changement de performances? Une utilisation particulière de la mémoire ? Je n'ai aucune saturation visible de la RAM ou des CPU.
    Ma seule explication serait un problème d'accès disque, qui serait impacté par une activité Windows silencieuse et variable, sachant que le disque est un disque crypté Par TrueCrypt, ça peut jouer.

    Merci beaucoup pour vos remarques, conseils, idées

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par nuke_y Voir le message
    Merci beaucoup pour vos remarques, conseils, idées
    C'est probablement du à une variation dans les entrées sorties disques. Cependant, pour savoir ce qui consomme cette bande passante là pendant que votre programme tourne, il faut mettre en œuvre des outils de monitoring système appropriés. Peut être qu'il faudrait demander dans le forum système ad hoc quel outil utiliser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Merci.

    Est-ce qu'il y aurait un moyen en Python d'isoler cet aspect "accès disque" ? Par exemple créer un tableau de File, les stocker en RAM au début du traitement (les fichiers ne prennent pas plus de 500 Mo sur le disque) avec l'ensemble du contenu pour ensuite boucler sur les n fichiers du tableau et donc mettre en évidence que le disque est la cause ?

    Merci

  4. #4
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Bon j'ai pu isoler la partie "ouverture des fichiers" de la partie "parsing" et effectivement c'est l'ouverture des fichiers qui est très fortement variable: de 18s je peux monter à 103s entre 2 runs ce qui ruine les perfs au global, alors que la partie parsing reste stable entre 15s et 17s, idem pour la partie BDD qui est stable à 10s.

    Merci beaucoup pour l'aide, je passe le sujet en résolu.

    Bon maintenant il faut que je trouve comment me passer d'un disque dur...

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par nuke_y Voir le message
    Est-ce qu'il y aurait un moyen en Python d'isoler cet aspect "accès disque" ? Par exemple créer un tableau de File, les stocker en RAM au début du traitement (les fichiers ne prennent pas plus de 500 Mo sur le disque) avec l'ensemble du contenu pour ensuite boucler sur les n fichiers du tableau et donc mettre en évidence que le disque est la cause ?
    A priori, ce n'est pas le disque qui est en cause mais la variation de la bande passante disponible pour votre application. Dit autrement, d'autres activités ralentissent votre programme.
    Si vous chargez tout en mémoire (voir io.StringIO pour çà), vous allez changer le profil des ressources utilisées (cpu, mémoire, io) par votre application. Après quelques mises au point, vous devriez constater des temps d'exécution plus stables mais cela ne vous donnera aucune idée sur les activités qui foutent la grouille.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Oui pardon, ce n'est pas le disque lui-même qui est en cause, mais la partie du traitement qui met en jeu les accès au disque. Il est effectivement tout à fait possible qu'un anti-virus provoque ça, ou une notion de quota ou n'importe quoi qui m'échappe totalement.

    Mais ça pointe la zone qu'il faut surveiller / analyser.

    Encore merci

  7. #7
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Par défaut
    Une idée comme ça: créer et utiliser un Ram Disk.
    C'est à dire de "monter" un partie de ma mémoire comme une pseudo partition disque.
    L'ouverture de fichier contenu sur ce disque devraient alors être beaucoup plus rapide.
    Reste quand même le temps de copie de ses fichiers sur ce disque, mais cela pourrait être une tache de fond qui les copies à mesure.

    Je sais que sous Linux, monter un tel disque n'est pas très compliqué (déjà utilisé)
    Par contre, je sais pas ce que cela vaux sous Windows, cela doit dépendre de l'outil spécialisé utilisé.

    Une autre piste aussi pour améliorer le processus: le migrer justement sur une machine Linux contenant que le stricte minimum afin d'éviter de se faire perturber par l'OS.
    Mais là, c'est repenser complètement l'architecture matériel de ton système.

  8. #8
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Mais mais mais... mais c'est une EXCELLENTE idée ça !

    Effectivement mettre toute l'architecture en l'air ça me tente moyennement mais par contre me faire un petit RAM disk tampon de 2 Go ça me semble une très bonne idée, il faut encore convaincre les administrateurs système toutefois

    Merci

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

Discussions similaires

  1. Performances variables selon présence ou non sur le réseau du PC ayant créé le report
    Par Gabriel.Entressangle dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 21/08/2007, 23h48
  2. Réponses: 9
    Dernier message: 11/12/2005, 06h06
  3. performances 9i sur linux
    Par learn dans le forum Oracle
    Réponses: 4
    Dernier message: 17/12/2004, 20h42
  4. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23

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