Подтвердить что ты не робот

Как эффективно использовать grep?

У меня есть большое количество небольших файлов для поиска. Я искал хорошую де-факто многопоточную версию grep, но ничего не мог найти. Как я могу улучшить использование grep? На данный момент я делаю это:

grep -R "string" >> Strings
4b9b3361

Ответ 1

Если у вас есть xargs, установленный на многоядерном процессоре, вы можете воспользоваться следующим, на случай, если кто-то заинтересован.

Окружающая среда:

Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB

Тесты:

1. Найдите необходимые файлы, подключите их к xargs и скажите ему выполнить 8 экземпляров.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8

real    3m24.358s
user    1m27.654s
sys     9m40.316s

2. Найдите необходимые файлы, подключите их к xargs и скажите ему выполнить 4 экземпляра.

time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings

real    16m3.051s
user    0m56.012s
sys     8m42.540s

3. Предлагается @Stephen: найдите необходимые файлы и используйте + вместо xargs

time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings

real    53m45.438s
user    0m5.829s
sys     0m40.778s

4. Регулярный рекурсивный grep.

grep -R "string" >> Strings

real    235m12.823s
user    38m57.763s
sys     38m8.301s

В моих целях первая команда работала нормально.

Ответ 2

Интересно, почему ниже используется -n1, не будет ли быстрее использовать более высокое значение (например, -n8? или оставьте его, чтобы xargs поступили правильно)?

xargs -0 -n1 -P8 grep -H "string"

Кажется, будет более эффективно давать каждому grep, который будет обрабатывать более чем один файл (я предполагаю, что -n1 даст только одно имя файла в argv для grep) - как я вижу, мы должны быть способны для обеспечения максимально возможного n в системе (на основе argc/argv максимального ограничения длины). Таким образом, стоимость установки для создания нового процесса grep не возникает чаще.