GNU параллельна чрезмерно медленной

Мне нужно запустить grep на пару миллионов файлов. Поэтому я попытался ускорить его, следуя двум подходам, упомянутым здесь : xargs -P -n и GNU parallel . Я попробовал это в подмножестве своих файлов (число 9026), и это было результатом:

  1. С xargs -P 8 -n 1000 очень быстро:

     $ time find tex -maxdepth 1 -name "*.json" | \ xargs -P 8 -n 1000 grep -ohP "'pattern'" > /dev/null real 0m0.085s user 0m0.333s sys 0m0.058s 
  2. С parallel , очень медленной:

     $ time find tex -maxdepth 1 -name "*.json" | \ parallel -j 8 grep -ohP "'pattern'" > /dev/null real 0m21.566s user 0m22.021s sys 0m18.505s 
  3. Даже последовательные xargs быстрее, чем parallel :

     $ time find tex -maxdepth 1 -name "*.json" | \ xargs grep -ohP 'pattern' > /dev/null real 0m0.242s user 0m0.209s sys 0m0.040s 

xargs -P n не работает для меня, потому что вывод из всех процессов чередуется, что не происходит с parallel . Поэтому я хотел бы использовать parallel не сталкиваясь с этим огромным замедлением.

Есть идеи?

ОБНОВИТЬ

  1. Следуя ответу Оле Танге , я попробовал parallel -X , результаты здесь, для полноты:

     $ time find tex -maxdepth 1 -name "*.json" | \ parallel -X -j 8 grep -ohP "'pattern'" > /dev/null real 0m0.563s user 0m0.583s sys 0m0.110s 
  2. Самое быстрое решение: после комментария @cas , я попытался grep с параметром -H (чтобы принудительно распечатать имена файлов) и сортировкой. Результаты здесь:

     time find tex -maxdepth 1 -name '*.json' -print0 | \ xargs -0r -P 9 -n 500 grep --line-buffered -oHP 'pattern' | \ sort -t: -k1 | cut -d: -f2- > /dev/null real 0m0.144s user 0m0.417s sys 0m0.095s 

  • как суммировать вывод awk или другого выражения с помощью xargs
  • Как я могу создать файл, который я получил из stdin без xargs
  • xargs repl_str не расширяет второй заполнитель
  • Сортировка вывода «find»?
  • Не удалось создать большой файл tar с трубкой и xargs
  • cp после того, как xargs не работает
  • Как мне регистрировать xargs -0 rm?
  • Найти файлы рекурсивно, которые старше одного года и не принадлежат конкретному пользователю
  • One Solution collect form web for “GNU параллельна чрезмерно медленной”

    Попробуйте parallel -X . Как написано в комментариях, причиной этого являются накладные расходы на запуск новой оболочки и открытие файлов для буферизации для каждого аргумента.

    Имейте в виду, что GNU Parallel никогда не будет так быстро, как xargs из-за этого. Ожидайте накладные расходы в 10 мс на каждое задание. С -X эти издержки менее значительны, поскольку вы обрабатываете больше аргументов в одном задании.

    Linux и Unix - лучшая ОС в мире.