grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Это работало в течение часа на довольно мощном сервере Linux, который в остальном не перегружен. Любая альтернатива grep? Что-нибудь о моем синтаксисе, которое можно улучшить (egrep, fgrep лучше?)
Файл на самом деле находится в каталоге, который используется совместно с другим сервером, но фактическое дисковое пространство является локальным, поэтому это не должно иметь никакого значения?
grep захватывает до 93% ЦП
-i
переключатель может замедлить процесс, попробуйте без него-i
или сLC_ALL=C grep ...
. Кроме того, если вы используете только фиксированную строку, используйтеgrep -F
.cindex .
чтобы проиндексировать вашу текущую папкуcsearch db_pd.Clients
.Ответы:
Вот несколько вариантов:
1) Префикс вашей команды grep с
LC_ALL=C
использованием языкового стандарта C вместо UTF-8.2) Используйте,
fgrep
потому что вы ищете фиксированную строку, а не регулярное выражение.3) Уберите
-i
опцию, если она вам не нужна.Итак, ваша команда становится:
Также будет быстрее, если вы скопируете файл на RAM-диск.
источник
grep -F
больше, чемfgrep
LANG=C
(вместоLC_ALL=C
) достаточно, и его легче набирать.fgrep
- это еще один способ писатьgrep -F
, как яman fgrep
вам скажу. В некоторых версияхman
также говорится, что первое не рекомендуется для второго, но более короткая форма слишком удобна, чтобы умереть.Если у вас многоядерный процессор, я бы действительно рекомендовал GNU parallel . Для параллельного поиска большого файла используйте:
В зависимости от ваших дисков и процессоров чтение больших блоков может быть быстрее:
Это не совсем понятно из вашего вопроса, но другие варианты
grep
включают:-i
флага.-F
флага для фиксированной строкиLANG=C
-m
флагом.источник
--pipepart
вместо--pipe
. Это намного быстрее.<
символ, предшествующий параллельной команде?cat file.sql | parallel ...
но избегает этого . GNU parallel также имеет способ читать ввод из файла с помощьюparallel ... :::: file.sql
. НТН.Некоторое тривиальное улучшение:
Удалите опцию -i, если можете, нечувствительность к регистру выполняется довольно медленно.
Заменить
.
на\.
Единственная точка - это символ регулярного выражения, соответствующий любому символу, что также является медленным.
источник
Две линии атаки:
-i
, или у вас есть возможность от него избавиться?grep
является однопоточным, поэтому вы можете захотеть запустить больше из них с разными смещениями.источник
Если вам нужно искать несколько строк, grep -f strings.txt сэкономит массу времени. Вышесказанное является переводом того, что я сейчас тестирую. значения параметров -j и -n, казалось, лучше всего подходят для моего варианта использования. -F grep также имеет большое значение.
источник