Grep Unix fonctionne-t-il plus rapidement avec des termes de recherche longs ou courts?

8

Est-il plus rapide de rechercher des termes de recherche longs ou courts? Ou cela affecte-t-il la vitesse? En d'autres termes, devez-vous rendre les termes de recherche aussi précis que possible?

Il y a plus de 100 000 fichiers et chaque fichier contient entre 20 et plus de 5000 lignes de données. Généralement, le grep est utilisé pour trouver une seule instance du terme de recherche.

Disons que le terme de recherche est SEARCHTERM, et il sera dans une rangée comme celle-ci:

NAD+DP+1234567890:92++UNIQUE+NAME+SEARCHTERM++12345+FI'

Est-il plus rapide de rechercher "SEARCH" ou "SEARCHTERM"? Disons que dans ce cas, nous ne nous soucions pas si nous trouvons également des correspondances dans d'autres lignes non liées.

Voici comment je le fais actuellement:

grep NAD+DP 123* | grep SEARCHTERM

Mais je trouve ça assez lent, quand même. Il faut généralement environ 3 à 5 minutes pour trouver les données, même lorsque je connais le nom de fichier approximatif, ce qui limite la plage à environ 10 000 fichiers.

Alors, un terme de recherche plus ou moins long serait-il utile? Pour autant que je sache, grep recherche des "blocs" de mots d'une certaine longueur?

Juha Untinen
la source

Réponses:

8

Quelques documents de référence:

GNU grep utilise l'algorithme bien connu de Boyer-Moore, qui recherche d'abord la dernière lettre de la chaîne cible, et utilise une table de recherche pour lui dire dans quelle mesure il peut sauter dans l'entrée chaque fois qu'il trouve un caractère non correspondant.

de Pourquoi GNU grep est rapide .

L'algorithme pré-traite la chaîne recherchée (le modèle), mais pas la chaîne recherchée dans (le texte). [...] En général, l'algorithme s'exécute plus rapidement à mesure que la longueur du motif augmente.

de l' algorithme de recherche de chaînes de Boyer – Moore .

Conclusion: utilisez des chaînes plus longues .

Maintenant, un peu de référence pour le plaisir:

# Initialisation
cd $(mktemp -d) && dd if=/dev/urandom of=random bs=1M count=1000
# Version
grep --v` # grep (GNU grep) 2.9
# Benchmark
(for s in 'short' 'this is not so short and we could even consider this as pretty long'; do for t in {1..10}; do time grep "$s" random; done; done ) 2> result

Résultats: 0,952s est la moyenne de la chaîne courte, 0,244s est la moyenne de la chaîne longue.

NB : La longueur n'est pas le seul critère à prendre en compte.

SylvainD
la source
0

Vous pouvez vous essayer en utilisant SEARCH ou SEARCHTERM. Essayez également de modifier l'ordre des deux commandes grep. Quoi qu'il en soit, la seule option utile sera très probablement d'utiliser plusieurs cœurs de processeur pour une seule recherche. Voir la parallelcommande.

Golimar
la source
0

Je ne pense pas que spécifier un terme de recherche plus spécifique le rendra sensiblement plus rapide.

Avec autant de fichiers à rechercher, vous devez en quelque sorte indexer vos données pour accélérer la recherche.

Je peux suggérer plusieurs façons:

  • Créez une base de données (PostgreSQL ou MySQL), importez vos données dans la base de données - un fichier sur une ligne, ajoutez un index FTS (recherche en texte intégral). Créez un utilitaire pour interroger la base de données.

  • Importez des données dans la base de données de manière plus granulaire, probablement une ligne dans une ligne (ou peut-être plus d'une table), créez des index de sorte que vos données soient consultables à l'aide d'index. Créez un utilitaire pour interroger la base de données.

  • Ajoutez vos fichiers dans le gitréférentiel, compactez-les en utilisant git gc, utilisez git greppour rechercher. D'après mon expérience, git greppeut être plus rapide que la norme greppar un facteur de 10x-100x.

mvp
la source
0

Logiquement, un terme plus court nécessitera moins de temps CPU, comme ce grepsera le cas

if (filechar[i] == pattern[i]) ...

moins de fois. En réalité, je suppose que a grepserait lié aux E / S et non lié au CPU, donc cela n'aura pas d'importance.

Scott
la source
1
Étonnamment, c'est faux car grep utilise un algorithme vraiment intelligent, veuillez vous référer à ma réponse.
SylvainD
plus la chaîne de recherche est longue, plus elle peut sauter de caractères lorsqu'elle trouve un décalage, donc la recherche sera plus rapide
phuclv