Гну параллельно не использует весь процессор

У меня есть простой скрипт на Python, который читает из stdin (единственная строка), выполняет некоторую обработку (синтаксический анализ строки, не требует ввода-вывода) и выводит в stdout

e.g. python parse.py < in.txt > out.txt

у меня есть in.txt который составляет около 200 ГБ, и я использую параллельный, чтобы ускорить его (у меня 8 процессорных ядер).

cat in.txt | parallel -j8 -N1 --pipe python parse.py

Я заметил, что процессор не полностью использует, например,

%Cpu0  :  9.1 us, 22.7 sy,  0.0 ni, 68.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 27.3 us, 13.6 sy,  0.0 ni, 59.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 14.3 us, 71.4 sy,  0.0 ni, 14.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 14.3 us, 28.6 sy,  0.0 ni, 57.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  : 14.3 us, 38.1 sy,  0.0 ni, 47.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  4.8 us, 23.8 sy,  0.0 ni, 71.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  : 15.0 us, 20.0 sy,  0.0 ni, 65.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  : 23.8 us, 19.0 sy,  0.0 ni, 57.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

А также

ps ax | grep python

я получил

12450 ?        S      0:00 /bin/bash -c               sh -c 'dd bs=1 count=1 of=/tmp/2NQLo8j4qy.chr 2>/dev/null';              test ! -s "/tmp/2NQLo8j4qy.chr" && rm -f "/tmp/2NQLo8j4qy.chr" && exec true;              (cat /tmp/2NQLo8j4qy.chr; rm /tmp/2NQLo8j4qy.chr; cat - ) | (python parse.py);
12453 ?        S      0:00 /bin/bash -c               sh -c 'dd bs=1 count=1 of=/tmp/zYnfr4Ss8H.chr 2>/dev/null';              test ! -s "/tmp/zYnfr4Ss8H.chr" && rm -f "/tmp/zYnfr4Ss8H.chr" && exec true;              (cat /tmp/zYnfr4Ss8H.chr; rm /tmp/zYnfr4Ss8H.chr; cat - ) | (python parse.py);
12456 ?        S      0:00 /bin/bash -c               sh -c 'dd bs=1 count=1 of=/tmp/wlrI14juYz.chr 2>/dev/null';              test ! -s "/tmp/wlrI14juYz.chr" && rm -f "/tmp/wlrI14juYz.chr" && exec true;              (cat /tmp/wlrI14juYz.chr; rm /tmp/wlrI14juYz.chr; cat - ) | (python parse.py);
12459 ?        S      0:00 /bin/bash -c               sh -c 'dd bs=1 count=1 of=/tmp/cyArLNBTTm.chr 2>/dev/null';              test ! -s "/tmp/cyArLNBTTm.chr" && rm -f "/tmp/cyArLNBTTm.chr" && exec true;              (cat /tmp/cyArLNBTTm.chr; rm /tmp/cyArLNBTTm.chr; cat - ) | (python parse.py);
12461 pts/0    S+     0:00 grep --color=auto python
15211 ?        S    144:22 perl /usr/bin/parallel -j8 -N1 --pipe python parse.py

Каждый раз, когда я бегу ps ax | grep python Я получил разные временные файлы, я полагаю, что ЦП тратится на работу с этими временными файлами? Или я что-то не так делаю?

2 ответа

Решение

Хотя ответ Марка верен и полностью поддерживается, вы можете попробовать новую функцию.

cat file | parallel --pipe ...

Максимальная скорость составляет около 100 МБ / с.

Новая экспериментальная опция --pipepart обеспечивает> 2 ГБ / с, но требует, чтобы in.txt был реальным (доступным для поиска) файлом:

parallel -a in.txt --block 100M --pipepart python parse.py

-N1 вызывает создание одного процесса в каждой строке. Вы видите накладные расходы параллельной настройки. Вы должны изменить скрипт python для обработки более чем одной строки. затем cat in.txt | parallel --pipe python parse.py следует в полной мере использовать процессоры.

Другие вопросы по тегам