Как эффективно использовать grep? - PullRequest
40 голосов
/ 05 марта 2011

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

grep -R "string" >> Strings

Ответы [ 2 ]

80 голосов
/ 05 марта 2011

Если у вас установлен 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

Для моих целей первая команда работала просто отлично.

4 голосов
/ 08 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...