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 :

Optimiser traitement donnees


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut Optimiser traitement donnees
    Bonjour,
    j'ai eu besoin de concatener le contenu de plusieurs dizaines de fichiers texte.
    pour cela j'ai réalisé le code ci-dessous:
    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
    import os
     
    liste_fichier_texte = os.listdir(r"fichiers_text_a_concat")
    full_single_text = ""
     
     
    for i in range (0, len(liste_fichier_texte), 1):
        fichier_text = open("fichiers_text_a_concat" + os.sep + liste_fichier_texte[i])
        text = fichier_text.readlines()
        fichier_text.close()
        for i in range(0, len(text), 1):
            full_single_text = full_single_text + text[i].strip("\n") + "\n"
     
     
    new_fichier_full_txt = open(r"Full_concat_text.txt", "w")
    new_fichier_full_txt.write(full_single_text)
    new_fichier_full_txt.close()
    Il marche, mais lors de l’exécution, j'ai constaté que le temps de traitement de chaque fichier texte était de plus en plus long... alors que les fichiers qui se succédaient n'étaient pas forcément de plus en plus lourd. Au final mes 150 fichiers texte se sont concaténés en un seul fichier texte en un peu moins de 10minutes.. pour 1 fichier de seulement 25Mo.

    il existe un moyen d'accélérer ce type de traitement?

    merci,
    cordialement,
    clem

  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 clement_74 Voir le message
    il existe un moyen d'accélérer ce type de traitement?
    Peut être que le temps devient de plus en plus long parce que vous accumulez le contenu de tous les fichiers lus dans une chaîne de caractères full_single_text qu'il faut réallouer à chaque itération.

    Puisque vous allez de toutes façons écrire les données dans le fichier de sortie, ça ne sert à rien de les garder en mémoire, écrire le contenu du fichier lu dans le fichier de sortie directement serait plus simple et irait plus vite.

    Si vous voulez garder tout çà en mémoire, éviter les réallocations et utilisez une liste de... lignes ou de contenu de fichiers (des gros blocs).
    note: il n'y a aucun intérêt à poser dans un forum PyQt une question où PyQt n'est pas concerné.


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

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut
    Bonjour, merci pour la réponse,
    je viens d'essayer la solution proposée mais, à priori, ça rend la chose plus lente...
    mais je ne poursuit pas ici, en effet, pas de pyqt sur ces lignes donc hors sujet!

  4. #4
    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 clement_74 Voir le message
    je viens d'essayer la solution proposée mais, à priori, ça rend la chose plus lente...
    Bizarre! postez le code.

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par clement_74 Voir le message
    Code python : 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
    import os
     
    liste_fichier_texte = os.listdir(r"fichiers_text_a_concat")
    full_single_text = ""
     
     
    for i in range (0, len(liste_fichier_texte), 1):
        fichier_text = open("fichiers_text_a_concat" + os.sep + liste_fichier_texte[i])
        text = fichier_text.readlines()
        fichier_text.close()
        for i in range(0, len(text), 1):
            full_single_text = full_single_text + text[i].strip("\n") + "\n"
     
     
    new_fichier_full_txt = open(r"Full_concat_text.txt", "w")
    new_fichier_full_txt.write(full_single_text)
    new_fichier_full_txt.close()
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import os
     
    with open(r"Full_concat_text.txt", "w") as f_out:
    	for f in os.listdir(r"fichiers_text_a_concat"):
    		with open(os.path.join("fichiers_text_a_concat", f), "r") as f_in:
    			f_out.write(f_in.read())
    Attention que os.listdir() ne donne pas les fichiers dans l'ordre alphabétique. Pour cela rajouter un sorted().
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut
    Bonjour,

    suite à la proposition de wiztricks, j'ai d'abord essayé d'enregistrer le fichier texte (de sortie) au fur et à mesure de la lecture de chaque fichier source.
    au final, c'était pas super rapide et je me suis dis que c'était peut être le simple fait que l'incrément d'un fichier qui grossit avait le même problème que la chaine de caractère qui grossit.

    donc j'ai opté pour la deuxième solution de wiztrick (qui elle marche tip top) à savoir que j'enregistre d'abord chaque contenu de chaque fichier texte dans un index d'une liste.
    Et là, étrangement (pour moi) il semble plus rapide de faire appel à une liste pour lui ajouter un index rempli de données que de d'ajouter du texte à un fichier texte.

    ci dessous le code qui marche (beaucoup mieux que la version précédente):
    NB: même pour une valeur de fichier texte final de plusieurs dizaines de Mo, l'enchainement des "print(i)" apparait homogène en termes de temps (et rapide).
    le plus long au final, c'est la dernière boucle (mais là , je pense que c'est juste normal que ça prenne 3-4 secondes pour enregistrer un ficher texte "lourd".


    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
    19
    20
    21
    22
    23
    24
    import os
    import csv
    import pandas as pd
     
    liste_fichier_texte = os.listdir(r"fichiers_text_a_concat")
    full_single_text = ""
    full_text = []
     
    new_fichier_full_txt = open(r"Full_concat_text.txt", "w")
    new_fichier_full_txt.close()
     
    for i in range (0, len(liste_fichier_texte), 1):
        fichier_text = open("fichiers_text_a_concat" + os.sep + liste_fichier_texte[i])
        text = fichier_text.readlines()
        fichier_text.close()
        for j in range(0, len(text), 1):        
            full_text.append(text[j].strip("\n") + "\n")
        print(i)
     
    new_fichier_full_txt = open(r"Full_concat_text.txt", "a")
    for k in range(0, len(full_text), 1):
        new_fichier_full_txt.write(full_text[k])
     
    new_fichier_full_txt.close()
    encore merci :-)

  7. #7
    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 clement_74 Voir le message
    Et là, étrangement (pour moi) il semble plus rapide de faire appel à une liste pour lui ajouter un index rempli de données que de d'ajouter du texte à un fichier texte.
    Comme c'est un problème que je n'arrive pas à reproduire chez moi, j'aimerai (toujours) voir le code qui va avec...

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

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut
    Bonjour,
    ci dessous, le code de la version "incrément du fichier texte" que j'estimais plus lente que le code ci dessus.
    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
    19
    20
     
    import os
     
    liste_fichier_texte = os.listdir(r"fichiers_text_a_concat")
    full_single_text = ""
     
    new_fichier_full_txt = open(r"Full_concat_text.txt", "w")
    new_fichier_full_txt.close()
     
    for i in range (0, len(liste_fichier_texte), 1):
        fichier_text = open("fichiers_text_a_concat" + os.sep + liste_fichier_texte[i])
        text = fichier_text.readlines()
        fichier_text.close()
        for j in range(0, len(text), 1):
            new_fichier_full_txt = open(r"Full_concat_text.txt", "a")
            new_fichier_full_txt.write(text[j].strip("\n") + "\n")
        print(i)
     
     
    print("Terminé!")

    Après relecture, je pense qu'il était maladroit, d'ouvrir/écrire ligne par ligne le fichier texte de sortie.
    c'est probablement cette lourdeur de code et d'organisation de de la donnée finale qui fait que la solution soit apparue moins bonne.


    merci encore pour le support!

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par clement_74 Voir le message
    Après relecture, je pense qu'il était maladroit, d'ouvrir/écrire ligne par ligne le fichier texte de sortie.
    Oui. C'est pour ça que je t'ai montré une façon de faire qui prend 3 lignes. Mais si tu prèfères ta solution abracadabrante, en stockant tout pour ensuite tout réécrire, en supprimant le '\n' de chaque ligne pour le réécrire après la ligne, bah l'important c'est le résultat
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Requette Trop longue. Comment optimiser ?[Traitement]
    Par Tankian dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/06/2006, 20h37
  2. [SGBD] Traitement Données Formulaire Vers BDD Mysql
    Par Thierry8 dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 29/03/2006, 23h22
  3. Optimiser traitement fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 14
    Dernier message: 16/03/2006, 13h33
  4. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 16h01
  5. Optimisation Traitement ADO
    Par adjava dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/04/2005, 14h48

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