Problème de vitesse exécution d'un script

Résolu
MasterID Messages postés 4 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 2 novembre 2008 - 17 mai 2008 à 17:41
Clempython Messages postés 9 Date d'inscription samedi 26 décembre 2009 Statut Membre Dernière intervention 29 mars 2011 - 3 janv. 2010 à 22:56
Bonjour,

j'ai réalisé un script qui récupère des informations dans un fichier texte, les traitent et retourne un autre fichier texte.
Le fichier texte créé peut-être très très lourd (plusieurs dizaines de Mo, sur plusieurs centaines de milliers de lignes).

Pour ce faire, chaque nouvelle ligne créée est concaténée dans une variable globale (il y a plusieurs boucles imbriquées d'où la longueur du fichier final) et ce n'est qu'à la fin du script que je crée le fichier et y entre toutes les informations.

Après différents tests, il semble que c'est la concaténation des nouvelles lignes dans la variable globale qui prend de plus en plus de temps (je suppose que plus cette variable grossi plus python a dû mal à y ajouter du texte).

J'aimerais savoir comment y palier, car il m'est quasiment impossible de créer un fichier qui dépasse les 10Mo.

Quelle est la méthode optimale ? La création de plusieurs variables globales intermédiaires afin de réduire la taille de chacune et ainsi faciliter la concaténation ? Ecrire au fur et à mesure dans le fichier  ? (bien que je préfèrerais que le fichier ne soit pas créé tant que le script n'est pas terminé, et qu'il me semble que les accès fichier sont très long).

Voilà, j'espère que vous pourrez m'aider, je ne programme que pour le plaisir, je n'ai que peu de notion sur l'efficacité d'un script.

Au revoir.

4 réponses

lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 77
19 mai 2008 à 00:12
Bonsoir MasterID

Je suppose que pour concaténer la variable tu utilises la méthode:
chaine = chaine + "aaaaa"
ou bien
chaine += "aaaaa"

Je ne crois pas me tromper en disant que sous Python l'objet chaine n'est pas modifiable.
Pour pouvoir réaliser l'instruction "chaine = chaine + "aaaaa" Python doit détruire l'ancien objet chaine pour pouvoir recréer le nouvel objet chaine, ce qui devient rapidement très couteux.

Je suggère de stocker les variables intermédiaires dans une liste et de réaliser la concaténation finale par la méthode ".join"

lst_chaine = []
lst_chaine.append("aaaaaaaa")
lst_chaine.append("bbbbbbb")
lst_chaine.append("ccccc")
#Concaténation finale
chaine = "".join(lst_chaine)
print chaine

Malgré tout, je pense que l'écriture au fur et mesure dans un fichier en sortie me semble plus naturel et pas obligatoirement plus long.
L'écriture est asynchrone seul le remplissage du buffer ralentira le traitement.
Le mieux est de faire un test.

Cordialement
3
MasterID Messages postés 4 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 2 novembre 2008
23 mai 2008 à 15:30
Bonjour,

Merci beaucoup, j'ai utilisé la méthode .join après avoir stocké les variables dans une table, le résultat est plutôt concluant. J'ai pu créer un fichier texte de 20.9 Mo sur 370 000 lignes en 20 secondes, ce qui est amplement suffisant.
Je n'ai pas essayé d'écrire au fur et à mesure dans le fichier, mais y-a-t'il un moyen de supprimer le fichier en cas d'erreur au cours de l'éxecution du script (et ce quelle que soit l'erreur) ?

Et encore merci .
0
lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 77
24 mai 2008 à 11:30
Bonjour
... mais y-a-t'il un moyen de supprimer le fichier en cas d'erreur au
cours de l'éxecution du script (et ce quelle que soit l'erreur) ?...

Tu peut utilser TRY et EXCEPT pour la gestion des erreurs (voir la doc)
Exemple:

# -*- coding: cp1252 -*-
import os

try:
    monfichier = open("monfichier.txt","w")
    gloupssss   #<=== erreur garantie
    #Suite des instructions du programme
    #...
except:
    print "erreur"
    monfichier.close()
    os.remove("monfichier.txt")
#Si le fichier n'est pas dans le répertoire courant il faut indiquer le chemin complet
0
Clempython Messages postés 9 Date d'inscription samedi 26 décembre 2009 Statut Membre Dernière intervention 29 mars 2011 17
3 janv. 2010 à 22:56
Je crois plutôt que ton problème vient de l'ouverture du fichier, readlines() est 10 fois plus rapide que readline(). tout dépends de la taille du fichier que tu traites.
0
Rejoignez-nous