Более эффективный способ поиска содержимого файлов в миллионах файлов

В настоящее время у нас есть ряд файлов, упорядоченных по дате, по типу, а затем отдельные файлы XML, содержащие детали, с базовой структурой как:

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

Эта файловая система часто сокращается, но мы часто иметь в структуре от 120 до 150 миллионов файлов. Иногда нам нужно опросить один из файлов, и иногда мы знаем дату, которую нам нужно просмотреть, а иногда нет. Если мы знаем, на какие даты мы смотрим, мы используем простую команду для проверки текста, который мы ищем:

ls -U | xargs grep -l TEXT

В котором перечислены файлы с определенным ТЕКСТОМ, которые мы затем можем запросить вручную.

Если мы знаем тип файла и текст для поиска, я сейчас использую команду find, например:

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

Остальные в группе используют команду ls с рекурсивным (-R) флагом.

С этими командами поиск занимает много времени, более суток - мне было интересно, знает ли кто-нибудь способ ускорить это или какие-либо команды замены, чтобы обеспечить более быстрое время поиска?

- edit1 - -

Параметр TEXT может находиться в любом месте файла, и эти файлы находятся в производственном блоке, поэтому я бы не решился добавить еще один процесс в этот блок, поскольку эти запросы являются специальными, и я предполагаю, что мой первоначальный запрос подробнее «правильно ли мы делаем это / есть ли у кого-нибудь способ получше»?

1
задан 31 January 2020 в 09:52

1 ответ

Вы можете протестировать что-то вроде

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

Это запустит 12 команд сна 1 , 4 параллельно. Команда займет 3 секунды.
В вашем случае:

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

Я не знаю, сколько потоков ЦП у вас есть, возможно, -P8 также возможен.
Когда команды ограничены вводом-выводом, это может мало помочь. В этом случае было бы интересно хранить все файлы xml в формате gzip и использовать zgrep .

0
ответ дан 8 February 2020 в 22:50

Другие вопросы по тегам:

Похожие вопросы: