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 :

Recherche dans plusieurs fichiers pas tres rapide


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut Recherche dans plusieurs fichiers pas tres rapide
    Bonjour,

    je fait des recherche d'une expression ou d'un mot dans des fichiers qui font en moyenne 29000 ligne, j'affiche un progressbar le problemme c'est que c'est hyper long la recherche se fait sr 300 fichiers, y a t-il un moyen pour que ce soit plus rapide, par exemple une api specifique, une dll ou un autre moyen quelquonque?

    mon algorithme de recherche est simple je balaye tous les fichiers du repertoire et pour chaque fichier je lit ligne par ligne en trouvant le mot a l'aide d'une expression reguliere. Ce sont des fichiers texte.

    Merci de votre aide.

  2. #2
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Ca serait peut-être plus rapide en lisant à chaque fois tout le fichier plutôt que ligne par ligne, puis avec un bon vieux string.Contains() sur la chaîne représentant le fichier entier.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut
    tu utilise "System.IO.File":

    string Textefile = File.ReadAllText("chemin de ton fichier", System.Text.Encoding.Default);

    aprés tu utilise le String.contains

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    oui par contre le readtextall met dans le string tout le fichier, si je souhaite afficher uniquement les lignes dont le mot apparait ca le fera pas je pense.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    J'utiliserai plutôt String.IndexOf() du coup, et avec ça, ayant la position de la recherche. Il sera simple d'en ressortir la ligne.

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par DarkHerumor Voir le message
    J'utiliserai plutôt String.IndexOf() du coup, et avec ça, ayant la position de la recherche. Il sera simple d'en ressortir la ligne.
    Simple de ressortir la ligne avec un IndexOf à partir d'une string de tout le fichier ?
    Si les lignes ont la même longueur, oui. Mais sinon, à part relire le fichier ligne par ligne, je ne vois pas comment tu envisages l'algorithme.

    Autre piste : utiliser différents threads pour les recherches.
    En pseudo-code, ça donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    - Pour chaque fichier
         - lancer un thread
              - rechercher avec RegEx sur tout le contenu
              - si le fichier contient l'élément recherché : relancer la recherche par ligne

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    donc en gros mon traitement je doit le faire dans un thread pour chaque fichier.

    je vais me mettre aux thread alors.

    Merci.

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par andromeda Voir le message
    je vais me mettre aux thread alors.
    .NET et les threads

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    par contre je me posais la question,300 thread ca risque de faire beaucoup ?
    etant donner que mon traitement doit se faire sur en moyenne sur 300 voir plus de fichier ?

  10. #10
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par andromeda Voir le message
    par contre je me posais la question,300 thread ca risque de faire beaucoup ?
    etant donner que mon traitement doit se faire sur en moyenne sur 300 voir plus de fichier ?
    C'est pas faux, tu risques d'exploser la mémoire vive...

    Faudrait peut-être limiter le nombre de threads à ce moment-là... ça se complique ! Mais il doit certainement y avoir des gens qui ont déjà réfléchi sur le sujet (pas moi, malheureusement ).

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    sinon j'insere un sleep de 20ms au bout de 20 thread une fois fini ils seront detruits comme ca ca fera 20 thread par 20 thread.

    sinon j'avais une question sur les thread, je ne sais pas si je dois ouvrir un autre post sur ce forum mais dans mon thread j'accede a des controle hors du thread tel que uen progresse bar ou un label et j'ai une exception me disant que je ne peux pas acceder a un controle exterieur au thread.

    est ce que je doit passer en parametre les controles que j'utilise dans mon thread ?

    Merci de votre aide.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben 300 fichiers de 29000 lignes en moyenne, ça m'étonne pas que ce soit long... Il faudrait tester avec find ou grep (oui, grep existe sous windows ) pour voir si c'est plus rapide... si c'est pareil, il n'y a sans doute pas grand-chose à faire pour améliorer (en partant du principe que find et grep doivent être assez optimisés...)

    Citation Envoyé par Skalp Voir le message
    Autre piste : utiliser différents threads pour les recherches.
    A vérifier, mais je suis pas sûr que ça change grand chose... En fait il faudrait utiliser un profiler pour voir ce qui prend du temps dans le programme. Si, comme je le soupçonne, ce sont les accès au disque qui prennent l'essentiel du temps, paralléliser la recherche ne changera sans doute pas grand chose...

    Citation Envoyé par Skalp Voir le message
    Faudrait peut-être limiter le nombre de threads à ce moment-là... ça se complique ! Mais il doit certainement y avoir des gens qui ont déjà réfléchi sur le sujet (pas moi, malheureusement ).
    En effet... Microsoft par exemple
    ThreadPool
    Ca permet de mettre des "tâches" en attente, qui seront exécutées par un certain nombre (configurable) de threads.

    Citation Envoyé par andromeda Voir le message
    sinon j'avais une question sur les thread, je ne sais pas si je dois ouvrir un autre post sur ce forum mais dans mon thread j'accede a des controle hors du thread tel que uen progresse bar ou un label et j'ai une exception me disant que je ne peux pas acceder a un controle exterieur au thread.
    Ah, un grand classique
    Tu ne peux accéder aux éléments de la fenêtre qu'à partir du thread qui a créé la fenêtre. Donc si dans le thread tu as besoin d'accéder, par exemple, au texte recherché, qui se situe dans une textbox, il faut d'abord le mettre dans une variable indépendante de l'interface graphique (avant de démarrer le thread). Le thread accédera ensuite cette variable. Pour la mise à jour de l'interface (affichage des résultats par exemple), il faut utiliser par la méthode Invoke de la fenêtre, en lui passant un delegate qui indique l'action à effectuer. Fais une petite recherche dans le forum avec les mots-clés "thread invoke", c'est un sujet qui revient souvent... C'est aussi expliqué dans le tuto indiqué par Skalp

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    avec les thread ca a l'air de bien fonctionner c'est toujours un peu long mias on pourra pas faire mieux je pense.
    de plus c'est un bon excercices pour les thread avec les delegate et invoke.

    Merci.

  14. #14
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par andromeda Voir le message
    c'est toujours un peu long mais on pourra pas faire mieux je pense.
    Par curiosité, ça donne quoi comme temps pour faire une recherche sur 300 fichiers de 29 000 lignes chacun ?

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    environ une minute au lieu de 5 ou plus, je dit 5 ou plus car avant je l'arrettait etant donner que je trouvait qe c'etait trop long, donc il y a quand meme une amelioration.

    la , j'ai juste a regler quelque probleme de thread et ce sera bon.

  16. #16
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Si c'est sur windows tu peux indexer les fichiers et consulter le catalogue obtenu.
    Sinon, http://www.spip.net/fr_article1575.html

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. Recherche dans un fichier *.pas
    Par gaby277 dans le forum Windows 8
    Réponses: 8
    Dernier message: 14/02/2014, 19h49
  2. [WD15] recherche dans plusieurs fichiers
    Par stefano dans le forum WinDev
    Réponses: 5
    Dernier message: 07/02/2012, 20h11
  3. Réponses: 7
    Dernier message: 18/11/2007, 12h38
  4. Module de recherche de mots dans plusieurs fichiers
    Par hat_et_m dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/09/2006, 21h09

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