Я использую xargs
для вызова сценария Python для обработки около 30 миллионов небольших файлов. Я надеюсь использовать xargs
для распараллеливания процесса. Я использую команду:
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
По сути, Convert.py
прочитает небольшой файл json (4 КБ), выполнит некоторую обработку и запишет в другой файл 4 КБ. Я работаю на сервере с 40 ядрами процессора. И никакой другой процесс, интенсивно использующий процессор, не выполняется на этом сервере.
Наблюдая за htop (кстати, есть ли другой хороший способ отслеживать производительность процессора?), Я обнаружил, что -P 40
это не так быстро, как ожидалось. Иногда все ядра замораживаются и уменьшаются почти до нуля в течение 3-4 секунд, затем восстанавливаются до 60-70%. Затем я пытаюсь уменьшить количество параллельных процессов до -P 20-30
, но это все еще не очень быстро. Идеальным поведением должно быть линейное ускорение. Есть предложения по параллельному использованию xargs?
xargs -P
и >
открывается для условий гонки из-за проблемы с половиной линии gnu.org/software/parallel/… Использование GNU Parallel вместо этого не будет иметь этой проблемы.