У меня есть большой набор файлов, для которых нужно выполнить некоторую тяжелую обработку. Эта обработка в однопоточном режиме использует несколько сотен мегабайтов ОЗУ (на машине, используемой для запуска задания) и занимает несколько минут для запуска. Мое текущее usecase - начать работу с hadoop на входных данных, но у меня была такая же проблема в других случаях раньше.
Чтобы полностью использовать доступную мощность процессора, я хочу иметь возможность запускать несколько этих задач в паралелле.
Однако очень простой пример оболочки script, как это, приведет к сбою производительности системы из-за чрезмерной нагрузки и замены:
find . -type f | while read name ;
do
some_heavy_processing_command ${name} &
done
Так что я хочу, по сути, похоже на то, что делает "gmake -j4".
Я знаю, что bash поддерживает команду wait, но только до тех пор, пока все дочерние процессы не будут завершены. Раньше я создавал скрипты, которые выполняют команду "ps", а затем grep файл обрабатывает по имени (да, я знаю... уродливо).
Какое самое простое/чистое/лучшее решение для выполнения того, что я хочу?
Изменить: Спасибо Фредерику: Да, действительно, это дубликат Как ограничить количество потоков/подпроцессов, используемых в функции в bash "Xargs -max-procs = 4" работает как шарм. (Поэтому я голосовал, чтобы закрыть свой вопрос)