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

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

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

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

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

Вот несколько вариантов:

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 также сыграл большую роль.

  • Генерировать файл CSV / TXT из именованного файла зоны
  • Как grep или искать .jar файлы для OpenSSL?
  • Ubuntu grep, find и т. Д.: Вывод «Разрешение отказано» и «Нет такого файла или каталога»
  • Bash, grep между двумя строками с заданной строкой
  • Захват групп из Grep RegEx
  • Unicode grep для Windows
  • Как искать текстовый файл для строк между двумя токенами в терминале Ubuntu и сохранять вывод?
  • Используя grep в R, чтобы найти строки как целые слова (но не строки как часть слов)
  • Получение этого простого регулярного выражения для соответствия в grep
  • Запись вывода «tail -f» в другой файл
  • Tar - исключить определенные файлы
  • Давайте будем гением компьютера.