Чи працює 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.