Применение grep к огромный файл (80Гб) любым способом, чтобы его ускорить?


 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

это работает в течение часа на довольно мощном сервере linux, который в противном случае не перегружен. Есть альтернатива grep? Что-нибудь о моем синтаксисе, который может быть улучшен, (egrep, fgrep лучше?)

файл на самом деле находится в каталоге, который совместно используется с монтированием на другой сервер, но фактическое дисковое пространство является локальным, поэтому это не должно иметь никакого значения?

grep захватывает до 93% CPU

5 79

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 также сделал большую разницу.