Bonjour,
je suis nouveau sur ce forum, j'ai 10 ans d'expérience. Je me remets au Perl après 8 ans, donc je me dois de rafraîchir un peu ma mémoire.
J'ai une problématique simple: rechercher de multiples (en centaines de milliers) occurences de chaînes dans une collection de fichiers. Réflexe de base: utiliser find et grep. Sauf que là, c'est fgrep pour accélérer, avec son option -f (prends toutes les occurrences de chaînes référencées dans mon fichier après le -f et matche).
Petit hic: ce fgrep (fast grep !) prend 15mns sur un seul fichier un peu gros (220K). Or c'est mon repository CVS que je dois analyser => dans deux mois ce ne sera pas terminé. Donc je récris une sorte de fgrep optimisé.
La solution que j'ai trouvée, qui est intermédiaire mais que je souhaite améliorer, c'est de hasher les entrées de mon fichier passé en -f (fichier de mes occurrences, appelons-le "keysfile"), puis de lire le fichier à grepper (appelons-le datafile), de concaténer tout le fichier datafile en une seule GROSSE chaîne, et d'itérer sur les hash keys (unicité garantie donc) en matchant chaque clef sur la GROSSE chaîne (le datafile donc).
C'est rapide (20 fois plus que grep) mais pas assez encore. Ce que je recherche en fait, c'est une sorte de primitive qui matcherait toutes les entrées d'un hash ou d'un tableau sur une chaîne à analyser. Est-ce que cela existe ?
J'ai une dernière cartouche pas encore tirée: constituer une chaîne de caractères des clefs sous forme de regexp: exp1|exp2|exp3 etc... et passer cette chaîne à grep.
Qu'en pensez-vous ?
Merci d'avance.
Christophe.
Partager