Используя awk с параллельным
У меня около 3000 файлов по 300 МБ каждый, и я хотел бы как можно быстрее найти серию подстрок с моим 16-ядерным сервером.
Это то, что я пытался, но не похоже, чтобы распараллеливать поиск файлов.
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
Он склеен из разных инструкций, я не до конца понимаю. Есть ли у вас какие-либо предложения о том, как я могу разделить обработку файлов?
2 ответа
- Посмотрите, есть ли у вас
parallel
программа в вашей системе. (Это может быть из GNU.) Если вы это сделаете, выясните, как его использовать. Иначе, - Запустить свой
find
с выводом в файл. Использование текстового редактора или, возможно, сценария с использованием таких инструментов, какhead
разбить этот файл на 16 файлов фрагментов с (приблизительно) равным количеством строк (т. е. ссылаться на равное количество найденных файлов). Тогда начни 16awk … | 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
,