Грепинг огромного файла (80 ГБ) любым способом ускорить его?
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Это работает в течение часа на довольно мощном Linux-сервере, который в противном случае не перегружен. Любая альтернатива grep? Что-нибудь о моем синтаксисе, который можно улучшить, (egrep, fgrep лучше?)
Файл фактически находится в каталоге, который совместно используется с монтированием на другой сервер, но фактическое дисковое пространство является локальным, так что это не должно иметь никакого значения?
grep захватывает до 93% CPU
- Ack + инструмент, подобный grep (проблема)
- Мониторинг файла до тех пор, пока не будет найдена строка
- двоичные файлы grepping и UTF16
- Подсчитайте все вхождения строки в большом количестве файлов с помощью grep
- Как обрабатывать каждую строку, полученную в результате команды grep
- Как использовать grep (), чтобы найти точное соответствие
- Как я могу «grep» рекурсивно фильтровать имя файлов, которые я хочу с помощью подстановочных знаков?
- Соответствие предложения с помощью grep
- Как найти файлы, которые не содержат заданный шаблон строки?
- Показывать, начиная со специальной строки, до специального регулярного выражения для команды хвоста Linux
- Извлечение уникальных чисел из строки в R
- Как удалить все пробелы из строки?
- Как подключить stderr, а не stdout?
Вот несколько вариантов:
1) Префикс вашей команды grep с LC_ALL=C
чтобы использовать локаль C вместо UTF-8.
2) Используйте fgrep
потому что вы ищете фиксированную строку, а не регулярное выражение.
3) Удалите опцию -i
, если она вам не нужна.
Итак, ваша команда становится:
LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Это также будет быстрее, если вы скопируете файл на RAM-диск.
Если у вас многоядерный процессор, я бы рекомендовал GNU параллельно . Для совместного использования большого файла:
< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'
В зависимости от ваших дисков и процессоров быстрее считывать большие блоки:
< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'
Из вашего вопроса не совсем ясно, но другие варианты grep
include:
- Отбрасывание флага
-i
. - Использование флага
-F
для фиксированной строки - Отключение NLS с помощью
LANG=C
- Установка максимального количества совпадений с флагом
-m
.
Некоторые тривиальные улучшения:
-
Удалите параметр -i, если вы можете, регистр без учета регистра достаточно медленный.
-
Замените
.
by\.
Единственной точкой является символ регулярного выражения для соответствия любому символу, который также медленный
Две линии атаки:
- вы уверены, вам нужен
-i
, или у вас есть возможность избавиться от него? - У вас есть больше ядер для игры?
grep
является однопоточным, поэтому вы можете захотеть начать их с разных смещений.
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'
Если вам нужно искать несколько строк, grep -f strings.txt экономит массу времени. Вышеупомянутый перевод того, что я сейчас тестирую. Значение параметра -j и -n, по-видимому, лучше всего подходит для моего варианта использования. -F grep также сыграл большую роль.