Мои строки - это пути к файлам s/14/11/13/15/n7ce49B_235_25ed2d70.jpg
; мои шаблоны довольно простые, все как n7ce49B_.+
.
Я работаю GNU grep 2.6.3
под Debian 6.0.10 на сервере Dell DL360G7 (я упоминаю это просто для того, чтобы дать представление о производительности этой машины) с 15k жесткими дисками , и эта команда: time LC_ALL=C grep -E -f path_to_patterns_file path_to_strings_file
просто не может завершиться - сервер слишком сильно поменяется местами. С 20к шаблонами это занимает более 3 часов.
Это кажется мне необоснованным.
По запросу комментария есть файлы: пути к файлам 20 тыс. Шаблонов
Можно также проверить и настроить количество входных линий и шаблонов с помощью:
xxd -p /dev/urandom | fold -sw 100 | head -n 1250 |
grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)
90k
, в описании есть20K
шаблоныgrep
.xxd -p /dev/urandom | fold -sw 100 | head -n 1250 | grep -Ef <(xxd -p /dev/urandom | fold -sw 10 | head -n 20000)
. Похоже, что время потрачено на компиляцию регулярных выражений и выделение большого количества памяти. С-F
вместо-E
, это мгновенно.n7ce49B_.+
эквивалентноn7ce49B_.
Ответы:
Вы столкнулись с проблемой производительности в более старых версиях GNU grep ( ошибка # 22357 ), которая была устранена этим коммитом , выпущенным в 2.28, хотя это изменение привело к некоторым регрессиям , поэтому вы захотите получить GNU
grep
3.0 или новее.источник