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

PyQt Python Discussion :

Chargement d'un gros fichier texte dans un QlistView [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut Chargement d'un gros fichier texte dans un QlistView
    Bonjour tout le monde,

    Ca fait un baille que je n'avais pas posté sur le forum. Voila, j'expose mon problème.

    J'utilise dans mon entreprise un logiciel BareTailPro, c'est un soft d'analyse de logs (de chaine de caractères en fait).

    Ce soft est généraliste et assez lourd d'usage pour des utilisateurs lambda ( il faut utiliser une syntaxe assez complexe basé a coup d'opérateur booléen.

    J'ai entrepris de faire un "clone" ou il y aurait une interface qui simplifierait l'usage. (Par exemple pour connaitre les positions de tel axe mécanique il suffirait de cliqué sur un checkbox).

    La structure est assez simple, dans le haut de l'écran un listview qui affiche le fichier log (environ 140Mo) dans le bas de l'écran un listview qui affiche le resultat du tri effectué dans le listview du dessus.

    Voici un exemple :

    Nom : Capture1.jpg
Affichages : 329
Taille : 223,7 Ko


    En fait mon principal problème est l'affichage du fichier log dans le premier listview.

    J'ai donc fait une procedure qui ouvre le fichier et l'affiche dans le listview. J'ai ajouté des tempos afin de mesurer le temps utilisé par python pour effectué les processus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        def openfile(self):
            t1 = time.time()
            with open("-Combined.txt", "r") as f:
                text = f.readlines()
                t2 = time.time()
                print("Fichier chargé en mémoire en " + str(t2 - t1))
                for lines in text:
                    self.textEdit.addItem(lines)
     
                t3=time.time()
                print("Contenu affiché en " + str(t3-t2))
            f.close()
    La console me retourne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fichier charger en mémoire en 0.9394903182983398
    Contenu affiché en 1.48594331741333
    Ce qui est bien, mais en réalité l'interface graphique affiche réellement après environ 1min15s en ornant d'un magnifique "pas de réponse" dans le titre du mainwindow.
    La c'est moins drôle.

    Voici ma question,

    Connaissez vous un moyen d'optimiser le rendu à l'écran de ce listview sachant que python apriori traite les données suffisament rapidement pour mon usage...


    Merci par avance.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 25
    Points : 45
    Points
    45
    Par défaut
    je ne réponds pas à ta question mais pourquoi ne pas utilisé un ElasticSearch/Kibana pour la gestion des logs, Kibana a une interface agréable et la recherche est "simple" à faire.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par parp1 Voir le message
    Connaissez vous un moyen d'optimiser le rendu à l'écran de ce listview sachant que python apriori traite les données suffisament rapidement pour mon usage...
    Quelle que soit la bibliothèque graphique, les instructions de mise à jour des widgets que vous effectuez dans un callback ne sont prises en compte qu'après le "retour" du callback i.e. lorsque le GUI videra la pile d'évènements via la mainloop.

    Dans votre cas, vous pourriez "forcer" ces mises à jour en appelant .update() toutes les N lignes lues.

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

  4. #4
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Bonjour! Merci pour vos réponses.

    pourquoi ne pas utilisé un ElasticSearch/Kibana
    J'ai survolé rapidement cette question, mais si j'ai bien compris ça nécessite une solution de serveur web pour fonctionner ? Si tel est le cas, ça ne m'arrange pas. En effet, il me faut une solution "locale" car les logs ne devont aller les chercher sur une plateforme web et nous les téléchargeons. En tout cas merci pour cette solution.


    Pour la solution proposé par wiztricks j'ai appliqué cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
        def openfile(self):
            t1 = time.time()
            with open("-Combined.txt", "r") as f:
                text = f.readlines()
                t2 = time.time()
                inc=0
                print("Fichier charger en mémoire en " + str(t2 - t1))
                for lines in text:
                    self.textEdit.addItem(lines)
                    inc=inc+1
                    if inc%1000==0:
                        self.textEdit.update()
     
            # self.textEdit.addItem(f.readline())
                t3=time.time()
                print("Contenu affiché en " + str(t3-t2))
            f.close()
    Dans le code textEdit est bien un Qlistview. Et non un QTextEdit.

    Toutefois rien ne se passe à l'affichage, pas de refresh. Ça ne fait pas planter le soft...mais c'est long.

    Merci par avance.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par parp1 Voir le message
    Toutefois rien ne se passe à l'affichage, pas de refresh. Ça ne fait pas planter le soft...mais c'est long.
    Désolé, il faut appeler la méthode .processEvents() associée à l'instance de QApplication que vous avez crée au tout début du programme.

    De toutes façons, il ne faut pas rêver: charger 140 Mo prendra du temps... Et il faudra quand même envisager de faire cela autrement.

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

  6. #6
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Merci en effet avec app.processevent() ca fonctionne.

    Merci.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/12/2018, 13h31
  2. modifier du texte dans un gros fichier texte
    Par christolb59 dans le forum MATLAB
    Réponses: 1
    Dernier message: 17/08/2012, 00h06
  3. Réponses: 7
    Dernier message: 09/06/2010, 17h47
  4. Insertion d'un fichier texte dans une moulinette PL/SQL
    Par Douanier007 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 24/01/2005, 16h08
  5. [CR] fichier texte dans un etat
    Par fab dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 12/09/2003, 10h59

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