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

VB.NET Discussion :

Optimisation du code de lecture de fichiers et dossiers


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Optimisation du code de lecture de fichiers et dossiers
    Bonsoir à tous,
    J'aimerais améliorer la vitesse d’exécution de mon code mais je ne sais pas comment faire. Celui-ci lit environ 60000 dossiers et 600 fichiers,
    les noms de dossiers sont stockés dans 2 listes 'CarSetupsListe' et 'TracksSetupListe', les fichiers sont stockés dans 'Setups'.
    Ça prends environ 10s sur mon PC portable et bien que s’exécutant en tache de fond, cela ne rends pas l'interface disponible tout de suite pour cette partie du programme.

    Les dossiers à lire sont organisés de cette façon :
    Car1/Track1/xxxxxx.ini
    Car1/Track2/xxxxxx.ini
    ....
    Car2/Track1/xxxxxx.ini
    Car2/Track2/xxxxxx.ini
    ....


    J’espère que vous pourrez m'aider car je ne vois vraiment pas comment faire....

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
     Private Sub LoadDataSetups()
            Setups.Clear()
            CarsSetupsListe.Clear()
            TracksSetupsListe.Clear()
            ' Chargement de la liste des Voitures et Circuits dans les listes :
            Dim countCarFolder As Integer
            Dim TotaleSetupsFolder As Integer = Directory.GetDirectories(Options.AC_Doc_Directory & "\setups").Length
            For Each CarFolder As String In Directory.GetDirectories(Options.AC_Doc_Directory & "\setups")
                countCarFolder += 1
                Dim CarName As String = Path.GetFileName(CarFolder)
                If Not CarsSetupsListe.Contains(CarName) Then
                    CarsSetupsListe.Add(CarName)
                End If
     
                For Each TrackFolder As String In Directory.GetDirectories(CarFolder)
                    Dim TrackName As String = Path.GetFileName(TrackFolder)
                    If Not TracksSetupsListe.Contains(TrackName) Then
                        TracksSetupsListe.Add(TrackName)
                    End If
     
                    For Each FileSetup As String In Directory.GetFiles(TrackFolder)
                        Dim Fi As New FileInfo(FileSetup)
                        If Fi.Extension.ToLower = ".ini" Then
                            Setups.Add(FileSetup, New Setup(FileSetup, CarName, TrackName))
                        End If
                    Next
                Next
                Dim Progress As Integer = CInt(100 * countCarFolder / TotaleSetupsFolder)
                bgwLoadSetups.ReportProgress(Progress, String.Format("Chargement des Setups ({0}%)", Progress))
            Next
            CarsSetupsListe.Sort()
            TracksSetupsListe.Sort()
        End Sub

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    BasicZX81,

    List.Contains(...) est assez lent , essaie avec un HashSet.Contains(...) qui est plus rapide :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Setups As HashSet(Of Setup)
    Dim CarsSetupsListe As HashSet(Of String)
    Dim TracksSetupsListe As HashSet(Of String)
    ...
    //pour le tri
    Dim CarsSetupsListe_result = From v In CarsSetupsListe Order By v
    Dim TracksSetupsListe_result = From v In TracksSetupsListe Order By v
    Ensuite pourquoi ToLower , ".ini" et ".INI" c'est équivalent.
    Y a sûrement d'autres optimisations mais c'est une piste.

    Salutations.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci pour ta Suggestion Fabiani mais le gain est assez faible. J'ai estimé à 0.5s plus rapide dans le meilleur des cas.

    Je pense que ce sont les 'GetDirectories' ou peut-être les 'GetFileName' qui prennent du temps.
    J'ai peut-être une piste d'amélioration car en fait je n'ai pas besoin de charger les dossiers Carx et Trackx dans les listes si les dossiers correspondant sont vides.
    Y a t'il moyen de lire tous les fichiers xxxx.ini contenu dans les sous-dossier en un minimum d'opération sans parcourir tous les dossiers ? J'ai vue que GetFiles possède une option AllDirectories, ça serait peut-être plus rapide que de parcourir tous les dossiers non ?

    Il me suffirait ensuite de parser les chemins complet des fichiers pour extraire les noms des dossiers Carx et Trackx et les charger dans les listes.

    Merci pour vos avis et suggestions.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    BasicZX81,


    Tu as raison, Directory.EnumerateDirectories et Directory.EnumerateFiles devraient donner de meilleurs résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                Dim folders = From folder In Directory.EnumerateDirectories(CarFolder)
                For Each TrackFolder As String In folders
                ...
                 Dim files = From file In Directory.EnumerateFiles(TrackFolder)
                 For Each FileSetup As String In files
                ...
    Salutations.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci de m'aider Fabiani, je ne connaissais pas cette méthode mais je n'ai quasiment rien gagné en vitesse...

    Je crois que je ferais un test avec la méthode que j'ai citée pour voir (a moins que quelqu'un ai une meilleur idée).

    EDIT :
    J'ai testé ça et cette ligne à elle seul prend une dizaine de secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim FilesSetups() As String = Directory.GetFiles(Options.AC_Doc_Directory & "\setups", "*.ini", SearchOption.AllDirectories)
    Je vois pas comment je peux faire pour faire plus rapide

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    Je suis peut être hors sujet mais si le problème à la base et le blocage de l'interface, ne serait-t-il pas plus utile de passer par de l'asynchronisme qui lui rendra l'interface réactive durant le traitement. Même si tu gagnes 50% de temps de traitement ton interface bloquera toujours pendant 5 secondes.
    Après cela ne retire pas l’intérêt d'optimiser l'algo de traitement.

    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Tu peux tenter de paralléliser en utilisant Directory.EnumerateFiles et Parallel.ForEach pour boucler sur tes fichiers. En fonction de tes traitements tu peux gagner pas mal !

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Très interressant la Parallelisation, je ne connaissais pas. Par contre je ne gagne pas beaucoup voir pas du tout sur mon Core2Duo.
    Je ne pense pas pouvoir trouver de solution miracle donc je vais laisser comme ça...

    Merci à tous.

  9. #9
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    Je ne pense pas pouvoir trouver de solution miracle donc je vais laisser comme ça...
    Si tu souhaites laisser la main sur l'IHM durant e traitement tu peux toujours exécuter ta fonction dans un thread. Le temps perçu s'en trouvera moins long.

Discussions similaires

  1. optimisation de code _ génération de fichier *kml
    Par XAR-WP dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2012, 11h41
  2. code pour lecture de fichier
    Par gege87270 dans le forum C
    Réponses: 34
    Dernier message: 25/10/2007, 10h47
  3. Réponses: 4
    Dernier message: 09/06/2007, 18h25
  4. Réponses: 2
    Dernier message: 08/11/2006, 20h57
  5. Réponses: 8
    Dernier message: 14/09/2006, 16h43

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