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 

  • Ни для чего ничего не нужно для xargs
  • Как сделать `head` и` tail` на вход с нулевым ограничением в bash?
  • Правильно избегая выхода из трубы в xargs
  • Почему xargs -n 1 настолько медленный для длинных строк
  • Почему «xargs bash -ic echo» не то же самое, что «xargs echo» или «xargs»?
  • Как я могу создать файл, который я получил из stdin без xargs
  • 'find -mtime -1 -print | xargs tar 'архивирует все файлы из каталога, игнорируя аргумент -mtime -1
  • Сортировка вывода «find»?
  • One Solution collect form web for “GNU параллельна чрезмерно медленной”

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

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

    Interesting Posts

    Код VS не работает на элементарной ОС

    Оказывает ли процесс на подчиненной стороне pty переговоры с линейной дисциплиной или с драйвером slave tty?

    Могу ли я создать контейнер Docker из Dockerfile интерактивным способом с выделением некоторого псевдо TTY?

    Что означает метки =>, ==>, ===>, ====>, -, – и определенное количество пробелов после них в выводе команды make install?

    Вручную "требовать" VT

    проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?

    Как сделать пароль для корневого каталога для просмотра выполнить?

    нет записей arp для vnet

    Debian не загружается должным образом, если не вставлен компакт-диск Guest Additions

    Как просмотреть результаты поиска htop

    pfsense: прозрачный прокси squid не работает в режиме моста

    Является ли моя компиляция ложной?

    Что такое подсистема (например, подсистема netfilter)?

    Сделайте SD-карту для загрузки образа дистрибутива, созданного с помощью Yocto

    Как изменить файлы в Unix, чтобы избежать политики очистки файлов?

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