Применение grep к огромный файл (80Гб) любым способом, чтобы его ускорить?
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
это работает в течение часа на довольно мощном сервере linux, который в противном случае не перегружен. Есть альтернатива grep? Что-нибудь о моем синтаксисе, который может быть улучшен, (egrep, fgrep лучше?)
файл на самом деле находится в каталоге, который совместно используется с монтированием на другой сервер, но фактическое дисковое пространство является локальным, поэтому это не должно иметь никакого значения?
grep захватывает до 93% CPU
5 ответов:
вот несколько вариантов:
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 parallel. Для grep большого файла параллельно используйте:
< 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
флаг.
некоторые тривиальные улучшения:
удалите опцию-i, Если вы можете, регистр нечувствителен довольно медленно.
заменить
.
by\.
одна точка является символом регулярного выражения, чтобы соответствовать любому символу, который также медленно
две линии атаки:
- вы уверены, что вам нужен
-i
, или у вас есть возможность избавиться от него?- у вас есть больше ядер, чтобы играть с?
grep
является однопоточным, поэтому вы можете начать больше из них на разных смещениях.
< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'
Если вам нужно найти несколько строк, строки grep-F.txt экономит массу времени. Выше приведен перевод чего-то, что я сейчас тестирую. значение параметра-j и-n, казалось, работало лучше всего для моего варианта использования. -F grep также сделал большую разницу.