Почему GNU параллельно так медленно, как однопроцессорный xargs для этой команды? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть команда bash, которая берет каталог, полный файлов XML, запускает их через XSLT в CSV и объединяет все преобразования в один файл.Я пытался использовать parallel, но загрузка ЦП никогда не превышает 100% для этой команды.Я не могу использовать xargs для этого, потому что выход перемежается.

Это занимает ~ 30 секунд, но опять же, выход перемежается: find /path/to/xml -type f -iname '*.xml' -print0 | xargs -0 -P8 xsltproc transform.xsl > out.txt

Это занимает ~ 90 секунд.Одноядерный. find /path/to/xml -type f -iname '*.xml' -print0 | xargs -0 xsltproc transform.xsl > out.txt

Это также занимает ~ 90 секунд.Столь же медленный, как одноядерный, и загрузка ЦП от top никогда не превышает 100%. find /path/to/xml -type f -iname '*.xml' -print0 | parallel -0 xsltproc transform.xsl > out.txt

Это выглядит так просто, я не знаю, что мне не хватает.Может ли кто-нибудь предложить предложение?

1 Ответ

0 голосов
/ 26 мая 2018

GNU Parallel имеет накладные расходы на работу порядка 5 мс.Таким образом, если ваши задания недолговечны, то эти издержки будут ограничивающим фактором.

xsltproc может принимать несколько файлов в качестве аргументов, поэтому это может помочь:

find /path/to/xml -type f -iname '*.xml' -print0 |
  parallel -X -0 xsltproc transform.xsl > out.txt

Редактировать

Если это правильно:

find /path/to/xml -type f -iname '*.xml' -print0 |
  xargs -0 -P8 xsltproc transform.xsl > out.txt

(за исключением смешанного вывода), то решение -X также должно работать правильно.Решение xargs -P8 поместит много имен файлов после transform.xsl.То же самое относится и к -X.Вы уверены, что вывод xargs -P8 является полным (хотя и смешанным) выводом?

Если xlstproc работает надежно только с одним именем файла, попробуйте следующее:

find /path/to/xml -type f -iname '*.xml' |
  parallel --pipe -N100 --round-robin parallel xsltproc transform.xsl > out.txt

Этопорождает parallel на ядро ​​процессора.Таким образом, вы должны увидеть 100% загрузки ЦП всех процессоров или 100% дискового ввода-вывода.Если файлы кэшируются, то вы должны увидеть 100% загрузку ЦП - но, в основном, из GNU Parallel.

...