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 

  • вывод технологического процесса на команду split by line и whitespace
  • xargs не работает в Linux, поскольку работает в Unix
  • xargs: слишком длинная строка аргументов
  • cp после того, как xargs не работает
  • Как использовать `yes` с` xargs -p`?
  • использование измененного содержимого файла в качестве аргументов
  • Как удалить команды в истории, соответствующие заданной строке?
  • Как иметь очередь процессов в AIX, например, xargs с «--max-procs»?
  • One Solution collect form web for “GNU параллельна чрезмерно медленной”

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

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

    Interesting Posts

    Воспроизведение звука при подключении к сети

    Предупреждение! Корневой диск не существует после элементарной установки

    Где ядро ​​поддерживает конфигурацию последовательного порта?

    Как использовать tail -f с grep для отображения окружающих линий

    gpg-agent пытается использовать несуществующий ключ ssh

    Монтаж по блочному адресу

    Как сделать звуковой сигнал приложения, когда я нажимаю на него, чтобы запустить его?

    Установка флеш-плеера для Firefox

    Проблемы с обновлением BIOS через Ubuntu

    Как заставить `dpkg` устанавливать зависимости

    служба fancontrol не запускается после перезагрузки open suse linux

    Как сжать каталог

    Как отображать каждый день месяца в отдельной строке с помощью tr, sed и cal

    Почему страницы-пользователи Unix используют двойные обратные ссылки вместо двойных кавычек?

    Рекурсивно подсчитывать количество слов в одинаково именованных файлах в разных каталогах

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