используя awk с параллельным

1301
kelorek

У меня есть около 3000 файлов по 300 МБ каждый, и я хотел бы как можно быстрее найти серию подстрок с моим 16-ядерным сервером.

Это то, что я пытался, но не похоже, чтобы распараллеливать поиск файлов.

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ END ' | paste -sd+ | bc 

Он склеен из разных инструкций, я не до конца понимаю. Есть ли у вас какие-либо предложения о том, как я могу разделить обработку файлов?

1
Вы, вероятно, I / O, не привязанный к процессору. Nicole Hamilton 11 лет назад 1
Это экземпляр с высоким I / O (hi1.4xlarge ec2), но вы, вероятно, правы. Я все еще хочу знать, как использовать GNU параллельно в этом контексте, но не смог заставить его работать. kelorek 11 лет назад 0

2 ответа на вопрос

1
Scott
  1. Посмотрите, есть ли у вас parallelпрограмма в вашей системе. (Это может быть из GNU.) Если вы это сделаете, выясните, как его использовать. Иначе,
  2. Запустите ваш findс выводом в файл. С помощью текстового редактора или, возможно, сценария, использующего такие инструменты, как head, разделите этот файл на 16 файлов фрагментов с (приблизительно) равным количеством строк (то есть, ссылаясь на равное количество найденных файлов). Затем запустите 16 awk … | paste … | bcтрубопроводов; по одному на каждый фрагмент файла. (И добавьте 16 результатов.)

Мне интересно, почему вы используете awkдля подсчета вхождений строки, когда grep -cспециально разработан для этого.

1
Thor

Параллель GNU довольно совместима с xargs, в вашем случае она может заменить его. Если вы считаете только случаи substringиспользования, grep -cкак Скотт предлагает:

sudo find /mnt2/preprocessed/preprocessed/mo* |  sudo parallel grep -c source | paste -sd+ | bc 

Обратите внимание, что некоторые версии GNU / Linux устанавливают GNU параллельно в режиме, совместимом с «Толлефом». Вы можете изменить это, добавив --gnuв командную строку аргументы в параллель. Для того, чтобы сделать изменения постоянного дополнения --gnuк ~/.parallel/config.

Grep оказывается намного медленнее, чем awk по какой-то причине, поэтому я пошел с awk. kelorek 11 лет назад 0
Это не сработало для меня - ничего не обрабатывается, когда я просто использую параллель вместо xargs. kelorek 11 лет назад 0
опубликовать вывод 'Parallel --version' Ole Tange 11 лет назад 0
@kelorek: awk быстрее, чем grep? какие версии grep и awk вы используете? В моих тестах подсчет вхождений в файле 200M `awk` занимает 3,7 с, grep -c - 1,2 с, а grep -Fc - 0,005 с. Thor 11 лет назад 0