1 votes

Un moyen plus efficace de trouver le contenu de fichiers parmi des millions de fichiers

Nous avons actuellement une série de fichiers classés par date, par type, puis des fichiers XML individuels contenant des détails, avec la structure de base suivante :

2020-01-01/
    FR_abc
        FR_abc_datetime_random.xml
        FR_abc_datetime_random.xml
        ...
        FR_abc_datetime_random.xml
    FR_def
        FR_def_datetime_random.xml
        FR_def_datetime_random.xml
        ...
        FR_def_datetime_random.xml
    FR_ghi
        FR_ghi_datetime_random.xml
        FR_ghi_datetime_random.xml
        ...
        FR_ghi_datetime_random.xml
    ...
    FR_xyz
        FR_xyz_datetime_random.xml
        FR_xyz_datetime_random.xml
        ...
        FR_xyz_datetime_random.xml

Ce système de fichiers est élagué fréquemment, mais nous avons souvent entre 120 et 150 millions de fichiers dans la structure. Parfois, nous aurons besoin d'interroger l'un des fichiers et parfois nous connaîtrons la date que nous devons regarder, et parfois non. Si nous savons quelles dates nous recherchons, nous utilisons une commande simple pour inspecter le texte que nous recherchons avec :

ls -U | xargs grep -l TEXT

Ce qui liste les fichiers avec le TEXTE spécifique que nous pouvons ensuite interroger manuellement.

Si nous connaissons le type de fichier et le texte à rechercher, j'utilise actuellement la commande find, donc :

find . -type f -name "^FR_ghi*" | xargs grep -l TEXT

Les autres membres du groupe utilisent la commande ls avec un drapeau récursif (-R).

Avec ces commandes, la recherche prend beaucoup de temps, plus d'une journée. Je me demandais si quelqu'un connaissait un moyen d'accélérer cette recherche, ou des commandes de remplacement permettant d'obtenir un temps de réponse plus rapide ?

-- edit1 --

Le paramètre TEXT peut être n'importe où dans le fichier, et ces fichiers sont sur une boîte de production, donc j'hésiterais à ajouter un autre processus sur cette boîte car ces requêtes sont ad-hoc et je suppose que ma question initiale est plus "faisons-nous cela de la bonne façon / quelqu'un a-t-il une meilleure façon" ?

0voto

Walter A Points 141

Vous pouvez tester quelque chose comme

time head -12 <(yes "1") | xargs -n1 -P4 sleep

Il s'agira de 12 sleep 1 commandes, 4 parallèles. La commande prendra 3 secondes.
Dans votre cas :

find . -type f -name "^FR_ghi*" | xargs -n1 -P4 grep -l TEXT

Je ne sais pas combien de threads de CPU vous avez, peut-être -P8 est aussi possible.
Lorsque les commandes sont limitées par les entrées/sorties, cela peut s'avérer peu utile. Dans ce cas, il peut être intéressant de stocker tous les fichiers xml au format gzippé et utiliser zgrep .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X