
У меня есть около 3000 файлов, каждый из которых имеет размер 300 МБ, и я хотел бы выполнить в них поиск последовательности подстрок как можно быстрее с помощью моего 16-ядерного сервера.
Я попробовал сделать это, но, похоже, это не распараллеливает поиск файлов.
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
Это склеено из разных how-to, я не совсем понимаю. Есть ли у вас предложения, как мне разделить обработку файлов?
решение1
- Посмотрите, есть ли у вас эта
parallel
программа в системе. (Она может быть из GNU.) Если есть, выясните, как ее использовать. В противном случае, - Запустите ваш
find
with output в файл. Используя текстовый редактор или, возможно, скрипт с использованием таких инструментов, какhead
, разделите этот файл на 16 файлов фрагментов с (примерно) равным количеством строк (т.е. ссылающихся на равное количество найденных файлов). Затем запустите 16awk … | paste … | bc
конвейеров; по одному для каждого файла фрагмента. (И сложите 16 результатов.)
Мне интересно, почему вы используете awk
для подсчета вхождений строки функцию , когда grep -c
она специально для этого предназначена.
решение2
GNU parallel довольно совместим с xargs, в вашем случае он может заменить его. Если вы считаете только случаи substring
использования grep -c
какСкоттпредполагает:
sudo find /mnt2/preprocessed/preprocessed/mo* |
sudo parallel grep -c source | paste -sd+ | bc
Обратите внимание, что некоторые версии GNU/Linux устанавливают GNU parallel в совместимом режиме "Tollef's parallel". Вы можете изменить это, добавив --gnu
в командную строку аргументы parallel. Чтобы сделать изменение постоянным, добавьте --gnu
в ~/.parallel/config
.