Чи працює Unip grep швидше при тривалих або коротких пошукових термінах?


8

Чи швидше шукати довгі або короткі пошукові терміни? Або це взагалі впливає на швидкість? Іншими словами, ви повинні зробити пошукові терміни максимально точними?

Існує понад 100 000 файлів, і кожен файл містить від 20 до понад 5000 рядків даних. Зазвичай grep використовується для пошуку лише одного екземпляра пошукової фрази.

Скажімо, пошуковий термін є SEARCHTERM, і він буде такий ряд:

NAD+DP+1234567890:92++UNIQUE+NAME+SEARCHTERM++12345+FI'

Швидше шукати "ПОШУК" чи "ПОШУК"? Скажімо, що в цьому випадку нам байдуже, якщо ми також знаходимо збіги в інших непов'язаних рядках.

Ось як це я зараз роблю:

grep NAD+DP 123* | grep SEARCHTERM

Але я вважаю це досить повільним, все-таки. На пошук даних зазвичай потрібно 3-5 хвилин, навіть коли я знаю грубе ім'я файлу, яке обмежує діапазон приблизно до 10 000 файлів.

Отже, чи допоможе більш довгий або коротший пошуковий термін? Наскільки я знаю, grep шукає «блоки» слів певної довжини?

Відповіді:


8

Деякі довідкові матеріали:

GNU grep використовує добре відомий алгоритм Бойєра-Мура, який спочатку шукає остаточну літеру цільового рядка, і використовує таблицю пошуку, щоб сказати, як далеко вперед він може пропустити у вхід, коли знайде невідповідний символ.

від Чому греп GNU швидко .

Алгоритм попередньо обробляє рядок, який шукається (шаблон), але не рядок, в якій шукається (текст). [...] Загалом алгоритм працює швидше, оскільки довжина шаблону збільшується.

від Бойєр-Мура алгоритму рядки пошуку .

Висновок: Використовуйте довші рядки .

Тепер трохи орієнтиру для розваги:

# Initialisation
cd $(mktemp -d) && dd if=/dev/urandom of=random bs=1M count=1000
# Version
grep --v` # grep (GNU grep) 2.9
# Benchmark
(for s in 'short' 'this is not so short and we could even consider this as pretty long'; do for t in {1..10}; do time grep "$s" random; done; done ) 2> result

Результати: 0,952s - це середнє значення для короткої струни, 0,244s - це середнє для довгої струни.

NB : Довжина - не єдиний критерій, який слід враховувати.


0

Ви можете спробувати себе за допомогою ПОШУК або ПОШУК. Спробуйте також змінити порядок двох команд grep. У будь-якому випадку єдиним корисним варіантом буде, швидше за все, використання декількох ядер CPU для одного пошуку. Дивіться parallelкоманду.


0

Я не думаю, що визначення більш конкретного пошукового терміну зробить його помітно швидше.

Маючи стільки файлів для пошуку, вам потрібно якось індексувати ваші дані, щоб зробити пошук швидшим.

Я можу запропонувати кілька способів:

  • Створіть базу даних (PostgreSQL або MySQL), імпортуйте свої дані в базу даних - один файл в одному рядку, додайте індекс FTS (пошук у повному тексті). Створіть деяку утиліту для запиту до бази даних.

  • Імпортуйте дані в базу даних більш деталізованим способом, ймовірно, один рядок в один рядок (або, можливо, більше однієї таблиці), створюйте індекси таким чином, щоб ваші дані були доступними для пошуку за допомогою індексів. Створіть деяку утиліту для запиту до бази даних.

  • Додайте свої файли до gitсховища, компактно git gcвикористовуйте їх git grepдля пошуку. На мій досвід, git grepможе бути швидше, ніж стандартне, grepза коефіцієнтом 10x-100x.


0

За логікою, коротший термін вимагатиме менше часу процесора, як grepце робиться

if (filechar[i] == pattern[i]) ...

менше разів. Насправді я б здогадався, що A grepбуде пов'язаним з I / O, а не з процесором, тому це не має значення.


1
Як не дивно, це неправильно, оскільки grep використовує дійсно розумний алгоритм, будь ласка, зверніться до моєї відповіді.
— SylvainD

чим довше пошуковий рядок, тим більше символів він може пропустити, коли виявить невідповідність, значить, пошук буде швидшим
— phuclv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.