Моя машина Linux имеет 16 процессоров и свободную память 70 ГБ, но когда я запускаю команду egrep , команда использует (проверено с помощью top команды) 100% ЦП и 0,5 памяти:

22391 aime      25   0 22.5g 337m  880 R 100.1  0.5   1094:06 egrep

Это означает, что используется только 1 из 16 процессоров.

Как я могу улучшить производительность здесь или заставить мой egrep использовать больше процессоров?

Я на самом деле grep ping в структуре каталогов, которая с точки зрения размера данных составляет 40 ГБ.

Примерное регулярное выражение:

egrep -H -i -R -a -o -n ([[:alnum:]_\.]+@[[:alnum:]_\.]*(xyz|abc)\.com) <dir>

Кроме того, поскольку я запускаю эту команду через скрипт Perl, может ли ForkManager помочь мне в этом отношении?

Спасибо

2 ответа2

2

Проблема использования ЦП связана с многопоточностью. egrep = 1 поток => 1 процессор. Если вы хотите использовать больше процессоров, то вам нужно разделить задачу на 16 небольших задач. Я предлагаю разделить данные на 16 блоков и запустить по одному egrep для каждого, и убедиться, что они назначены для разных процессоров каждый.

1

Идеи:

  • Если вы все равно используете сценарий Perl, почему бы не использовать Perl для сопоставления?
  • Из сценария оболочки find + GNU параллельно (или xargs -P , как пишет Шверн) - наиболее очевидный способ параллельного применения egrep к вашим входным файлам; очевидно, что они также могут быть вызваны из Perl, или вы можете использовать эквиваленты Perl (например, File::Find).
  • Вы можете распараллелить, применив greps: первый выполняет очень быструю, простую предварительную фильтрацию, второй - точное и дорогое сопоставление, но может ли этот подход сэкономить вас в любое время, зависит от того, что вам нужно сопоставить, и от подробностей реализации egrep, которые Я не знаком с

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .