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 :

[os.walk] Optimisation du temps de traitement sur une grosse arborescence + filtre [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Par défaut [os.walk] Optimisation du temps de traitement sur une grosse arborescence + filtre
    Bonjour à toutes à et à tous,

    Je cherche à optimiser le temps de traitement d'une fonction qui me liste les chemins d'accès à des fichiers selon plusieurs conditions. Je précise que la fonction fait son job, mais est très longue car elle lit une arborescence d'environ 4500 éléments.

    En gros je récupère les chemin d'accès si je trouve dans l'un des dossiers un ficher .LOG qui se termine par "_CODEINSEE", selon une liste de commune donnée (liste qui varie d'un vingtaine à 500 codes communes). Je récupère alors le chemin d'accès à un fichier .SHP dans un sous-dossier qui est avec ce fichier .LOG. Je stock ces chemins d'accès dans une liste lorsque validé.


    chem : dossier de recherches avec sous dossiers (4500 élements)
    listeCom : liste des codes INSEE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for dossier, sous_dossiers, fichiers in os.walk(chem):         
                for fichier in fichiers:
                    for com in listeCom:
                        # si fichier log se terminant par code INSEE et ne contenant pas ZC => Go
                        if fichier.endswith('.LOG') and fichier.find('_'+ com)!= -1 and fichier.find('ZC')== -1 :
                                iti = dossier + "\Iti\Ft_ArcIti.shp"
                                #vérification
                                if os.path.isfile(iti):
                                    listeIti.append(iti)
                                else:
                                    lchemFake.append(iti)
    Ca marche mais c'est long, quelqu’un aurait-il une piste?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    4500 fichiers x 20 à 400 code INSEE = un certain nombre d'itérations à réduire.

    Comme vous voulez récupérer les dossiers qui contiennent au moins un fichier intéressant, pas la peine de regarder tous les fichiers. Pour voir si le nom d'un fichier correspond à votre pattern, vous pouvez utiliser des regexp. Enfin, une fois le code INSEE extrait, il sera plus rapide de tester sa présence dans un set que d'itérer sur tous les éléments d'une liste.

    Ce qui traduit en Python donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
    rg = r'^((?!ZC).)*_(\d{5}).LOG'
    communes = set(listCom)
     
    for dossier, sous_dossiers, fichiers in os.walk(chem): 
         for s in fichiers:
              match = re.match(rg, s)
              if match and match.groups()[1] in communes:
                    # ajouter le dossier à la liste
                     break # et pas la peine de regarder les autres.
    que je n'ai pas testé.

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

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    également puisqu'il est question de python 2.x, il est notoirement connu que os.walk() est lent, sous Python 2 il existe le module scandir() pour accélérer un peu les opérations sur le fs

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Par défaut
    Bonjour,

    Merci beaucoup à vous deux pour vos réponses,
    J'ai testé sur un jeux de données :

    Fonction Originale : 12 minutes
    Méthode de Wiztricks : 8 minutes


    J'ai tenté la proposition de BufferBob mais malheureusement la méthode scandir() n'est pas intégrée dans le Package Arcpy (module python d'ESRI) utilisé au sein de l'entreprise, et je ne peux pas installer de bibliothèques supplémentaires. Etant donné que je ne suis pas un expert je vous laisse quand même ma version python même si je doute que ça vous avance : (sys;version) 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)]

    En tout cas merci à vous deux, la méthode de W représente un gain important, je vais continuer à me renseigner sur les regexp que je connaissais pas.

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

Discussions similaires

  1. Optimiser temps de traitement sur des requêtes simples
    Par yoyo88 dans le forum Langage SQL
    Réponses: 21
    Dernier message: 20/02/2015, 12h35
  2. [MySQL] Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 17/06/2011, 18h37
  3. optimiser le temp du traitement d'une boucle
    Par riad_09 dans le forum Développement
    Réponses: 1
    Dernier message: 05/11/2009, 08h38
  4. Réponses: 2
    Dernier message: 11/04/2009, 12h57
  5. Réponses: 13
    Dernier message: 19/12/2008, 14h32

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