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

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

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

  2. Как убить весь процесс с заданным именем?
  3. grep содержимое файлов на основе списка файлов
  4. Найти совпадения на смежных линиях
  5. Почему добавление двоеточия нарушает этот шаблон grep?
  6. GREP для процессов по каталогам и убить его
  7. Как расширить псевдонимы bash
  8.  $ 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 
  9. С 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 
  10. Даже последовательные 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 

  • Найти файлы, которые не находятся в .gitignore
  • Соответствовать регулярному выражению между разделителями
  • Выполнение одной и той же команды с разными аргументами параллельно
  • вывод искажается при параллельном запуске «xargs ls»
  • Почему я получаю «недопустимый максимальный счет» из grep в псевдониме?
  • как извлечь номер из строки в unix
  • One Solution collect form web for “GNU параллельна чрезмерно медленной”

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

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

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