1

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

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

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

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

2 ответа2

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

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

1

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

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