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

C# Discussion :

Comment créer un engin de recherche performant sous C#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Comment créer un engin de recherche performant sous C#
    Je dois faire la recherche d'un dossier contenant 10000 fichiers dans un dossier windows. Est-ce qu'il y a une méthode plus performante que celle-ci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try
                {
                    foreach (string f in Directory.GetFiles("C:\test", "*.doc*"))
                        {
                            DoStuff(f);
                        }   
                }
                catch (System.Exception excpt)
                {
                    Console.WriteLine(excpt.Message);
                }
    Je sais pas si ce serait plus performant de créer une table de hashage et ensuite de chercher celle-ci?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    un dictionnaire je pense est plus rapide...

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Un dictionnaire c'est bien lorsque l'on veut pouvoir accéder rapidement à un élément donné, hors ce n'est pas ce qui est recherché ici. Un dictionnaire n'apportera donc rien.

    Il n'y a pas de méthode plus performante que ce que tu as fait, à ma connaissance en tout cas. A la rigueur on peut imaginer "threader" la recherche pour chaque sous-répertoire, mais aucune idée si cela apporterait quelque chose. De toute façon, récupérer un ensemble de fichiers prendra forcément du temps.

    As-tu fait le test en condition réelle pour voir si cela te pose vraiment un problème ? Car vouloir optimiser c'est bien, mais si c'est un peu lent et que cela suffit tout de même, pas la peine d'optimiser.

    Bref, regarde en condition réelle le temps que cela prend pour récupérer ta liste de fichiers (la classe StopWatch permet de faire des mesures de temps à ce niveau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    StopWatch watch = new StopWatch();
    watch.Start();
    Directory.GetFiles(@"C:\test", "*.doc*");
    watch.Stop();
    Après tu n'as plus qu'à regarder le temps que t'indique le chrono
    Pas de questions techniques par MP

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Je n'ai pas encore trouvé de FS qui gerait de maniere performante un grand nombre de fichier dans un répertoire
    En tout cas pas FAT32 ni NTFS
    C'est meme souvent catastrophique si on commence a depasser quelques centaines de fichiers alors quand tu parle de 10000

    La premiere chose que je te conseillerait si c'est possible, c'est de subdiviser a la source en plusieurs repertoires
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    Citation Envoyé par olibara Voir le message
    La premiere chose que je te conseillerait si c'est possible, c'est de subdiviser a la source en plusieurs repertoires
    le problème sera le même, ca galère tout autant ... ya que les systèmes de fichiers linux (ext2/...) qui peuvent gérer des grands nombres de fichiers/reps sans trop ramer.
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Lorenzo77

    Je maintiens quand meme que gerer 500 fichiers dans un repertoire ou 10000 ce n'est pas du tout lineaire !

    Donc, s'il parvient a faire un arbre de repertoires sur 4 niveau par exemple et limiter la recherche dans le repertoire ad-hoc, ca ira beaucoup plus vite

    N.B. Maintenant je dis un arbre mais ca peut aussi etre un vecteur de repertoire, ce qui compte surtout c'est le nombre de fichier dans un repertoire
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Finalement j'ai fais des tests et je n'ai pas de problème pour les performances pour 10000 fichiers si les fichiers sont sur un disque local ou sur un map net-work drive. Par contre j'ai des gros problème de performances lorsque j'utilise directement l'adresse réseau.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try
                {
                    foreach (string f in Directory.GetFiles(@"\\GMCANADA\MANUFACTURING_PARTS\", "*.CATPart*"))
                        {
                            DoStuff(f);
                        }   
                }
                catch (System.Exception excpt)
                {
                    Console.WriteLine(excpt.Message);
                }
    Il est impossible de changer la hierarchie du dossier et des fichiers à court terme.

Discussions similaires

  1. Comment créer un état(Rapport) en Java sous JBuilder?
    Par Sylvies209 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 06/02/2009, 13h30
  2. Réponses: 3
    Dernier message: 16/06/2008, 15h23
  3. comment créer un bouton enregistrer l'image sous
    Par faucon54 dans le forum Langage
    Réponses: 1
    Dernier message: 05/06/2007, 08h43
  4. Comment créer une BD et une table sous MySQL.
    Par User dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 12/03/2007, 16h16

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