Грепинг огромного файла (80 ГБ) любым способом ускорить его?
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Это работает в течение часа на довольно мощном Linux-сервере, который в противном случае не перегружен.
Любая альтернатива grep? Что-нибудь о моем синтаксисе, который можно улучшить, (egrep, fgrep лучше?)
Файл фактически находится в каталоге, который совместно используется с монтированием на другой сервер, но фактическое дисковое пространство является локальным, так что это не должно иметь никакого значения?
grep захватывает до 93% CPU
Ответы
Ответ 1
Вот несколько вариантов:
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-диск.
Ответ 2
Если у вас многоядерный процессор, я бы порекомендовал GNU parallel. Для совместного использования большого файла:
< 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
включают:
- Отбрасывание флага
-i
.
- Использование флага
-F
для фиксированной строки
- Отключение NLS с помощью
LANG=C
- Установка максимального количества совпадений с флагом
-m
.
Ответ 3
Некоторые тривиальные улучшения:
-
Удалите параметр -i, если вы можете, регистр без учета регистра данных будет довольно медленным.
-
Замените .
на \.
Одна точка - это символ регулярного выражения, соответствующий любому символу, который также медленный
Ответ 4
Две линии атаки:
- Вы уверены, вам нужен
-i
, или вы можете избавиться от него?
- Есть ли у вас больше ядер для игры?
grep
является однопоточным, поэтому вы можете захотеть запустить их с разными смещениями.