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 :

Parcours d'une arborescence avec utilisation programmation parallèle


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut Parcours d'une arborescence avec utilisation programmation parallèle
    Bonjour à tous!

    Je me permets de solliciter votre aide dans le cadre d'un mini projet que je dois effectuer.
    Je suis débutant en Python et bien que je ne développe pas bcp ni super bien j'ai des notions de programmation provenant d'autres langages (C/C++, Java, VBA....),
    Lors de mes études d'ingé, j'avais eu des cours de programmation parallèle (traités en C++), mais ce sont des souvenirs relativement lointains.
    Pour ce mini projet d'entreprise (demandé par mon patron), je dois parcourir l'intégralité d'un répertoire de dossiers clients et en afficher "l'arborescence".
    Concrètement par le biais de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os 
    path="H:\\CLIENTS ACTIFS" 
     
    ## print(len(os.listdir(path)))
     
    for dossier, sous_dossiers, fichiers in os.walk(path):
        print('##### %s #####' % dossier)
        print("Sous dossiers : %s" % sous_dossiers)
        print("Fichiers : %s" % fichiers)
    J'arrive à afficher ce que je souhaite (bien qu'à terme l'idéal serait de mettre ces résultats dans un .csv en fonction des niveaux de profondeur).
    Ce qui me pose problème c'est que ce traitement prend 40-45 min à s'exécuter car il y 400 dossiers contenant eux-mêmes une quantité importante de sous-dossiers et fichiers.
    Ma question est : que me conseilleriez-vous pour réduire ce temps ?
    Je pensais diviser le traitement en plusieurs boucles qui tourneraient en // (il me semble que c'est comme cela que je l'avais vu en C++).
    Par exemple la 1ère traiterait les dossiers de 1 à 100, la 2ème de 101 à 200, la 3ème de 201 à 300 et la 4ème de 301 à 400, mais je ne sais absolument pas comment traiter ça car peut-être trop technique pour moi et si c'est envisageable en Python aussi.
    De ce que j'ai pu lire, il ne me semble pas que threading, concurrent.futures, multiprocessing, gevent et greenlets ou celery pourraient y répondre.

    Je vous remercie par avance.
    Bonne journée,

    Bastien

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Salut,

    Le temps d'exécution est anormalement long, Python est particulièrement rapide pour ces tâches.

    Les print retardent l'exécution et pas un peu alors esaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import os
    import time
    path="le/chemin" 
    files = 0
    begin = time.time()
     
    for dossier, sous_dossiers, fichiers in os.walk(path):
        files += len(fichiers)
    end = time.time() - begin
    print(" %s files in: %s" %(files, end))
    Je viens d'essayer avec "/home/vincent"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     509582 files in: 55.77560377120972
    56 secondes pour plus de cinq cent mille fichiers ça reste raisonnable.

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Salut,

    Merci pour ta réponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     157705 files in: 413.0776505470276
    Je ne sais pas si le résultat dépend du fait que je sois sur un Windows (et que c'est plus lent que toi) m'enfin tjrs est-il que c'est bien mieux!
    En revanche, est-ce que tu pourrais m'aiguiller afin de sortir ce parcours dans un .csv en fonction de la profondeur/niveau des dossiers/sous-dossiers et fichiers comme dans ce fichier?
    arbo type.xlsx

    Je cherche via le module csv, mais y'a-t-il un autre module peut-être plus adapté ou bien l'affichage est trop "complexe"?
    Le but est en fait qu'une personne qui, par exemple, est en charge du dossier 1 sache ce qui le compose ou si elle se situe sur le fichier 1 qu'elle sache sous quel(s) dossier(s) il est.
    Ceci est dans le cadre d'une migration/restructuration des dossiers.

    Merci pour ton aide!

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hiandzel Voir le message
    Je cherche via le module csv, mais y'a-t-il un autre module peut-être plus adapté ou bien l'affichage est trop "complexe"?
    Bonjour

    Etant donné que le csv est plutôt fait pour des lignes structurées de la même façon (même nombre de champs, etc) et donc s'adapte mal à une arborescence où chaque niveau d'infomation est "variable" (tantôt profondeur de 3, tantôt de 1) et si tu n'as pas d'impératif, alors je pense que le xml serait plus adapté.
    Code xml : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <level=1>
    	<name="dossier1"/>
    	<level=2>
    		<name="sous-dossier1"/>
    		<level=3>
    			<name="fic1"/>
    			<name="fic2"/>
    		</level>
    	</level>
    	<level=2>
    		<name="sous-dossier2"/>
    		<level=3>
    			<name="fic3"/>
    		</level>
    	</level>
    </level>
    <level=1>
    	<name="fic4"/>
    	<name="fic5"/>
    </level>
    <level=1>
    	<name="dossier2"/>
    	<level=2>
    		<name="sous-dossier1"/>
    		<level=3>
    			<name="fic6"/>
    			<name="fic7"/>
    		</level>
    	</level>
    	<level=2>
    		<name="sous-dossier2"/>
    		<level=3>
    			<name="fic8"/>
    		</level>
    	</level>
    </level>
    <level=1>
    	<name="fic9"/>
    	<name="fic10"/>
    </level>

    Si le CSV est obligatoire, alors t'as plusieurs possibilités. Soit répéter les dossiers à chaque ligne...
    Code csv : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dossier1:sous-dossier1:fic1
    dossier1:sous-dossier1:fic2
    dossier1:sous-dossier2:fic3
    fic4

    Soit laisser à "vide" les informations dupliquées...
    Code csv : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dossier1:sous-dossier1:fic1
    ::fic2
    :sous-dossier2:fic3
    fic4
    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]

  5. #5
    Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Bonjour,

    En effet, je n'ai pas pensé au XML!!
    Merci pour ce coup de pouce!

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

Discussions similaires

  1. [debutant] dimensionnement d'une JFrame avec utilisation d'un pack()
    Par scarpat dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 02/06/2006, 09h45
  2. Réponses: 3
    Dernier message: 28/03/2006, 10h52
  3. [VBA-A]Parcours d'une arborescence dossiers et fichiers
    Par sidneyvba dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/03/2006, 16h58
  4. copie d'une arborescence avec excel vb
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/11/2005, 08h31
  5. TForm dans une DLL avec utilisation d'Interface
    Par guedelmalin dans le forum Langage
    Réponses: 13
    Dernier message: 17/06/2005, 11h58

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