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

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

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

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

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

2 ответа

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

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

Параллель 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,

Другие вопросы по тегам