У меня вопрос о масштабируемости производительности с помощью xargs. В настоящее время у меня есть пакетная программа, написанная на питоне с многопроцессорностью и подпроцессом. Каждый процесс создает независимый subprocess.popen() для выполнения внешней команды. Недавно я понял, что весь процесс можно переделать с помощью xargs. Тем не менее, я задаюсь вопросом, стоит ли использовать xargs для обработки файлов 10k +, поскольку я никогда раньше не делал этого масштаба только с инструментами командной строки. Учитывая мой тест с небольшими наборами данных, на самом деле это не плохая идея, если все, что я делаю, это пакетный запуск множества команд, поскольку он избегает многих циклов накладных расходов, налагаемых модулями python, но я хотел бы узнать больше от тех, кто может иметь больше опыта работы с xargs и python. Более конкретно, существует ли какой-либо буферный лимит, который мне нужно настроить для xargs для потребления большого количества входов? Благодарю.Производительность для xarg против многопроцессорности python + подпроцесс
ответ
Программа xargs
будет собирать несколько аргументов со стандартного ввода и склеить их вместе, чтобы сделать одну длинную командную строку. Если для одной командной строки слишком много аргументов, слишком много, то она будет создавать и выполнять несколько команд, сколько угодно.
Это означает, что для запуска процессов и их закрытия требуется меньше накладных расходов. Насколько хорошо это будет для вас, зависит от продолжительности ваших процессов. Если вы запускаете какую-то программу с интенсивным процессором, которая будет работать в течение получаса, время запуска для процесса будет несущественным. Если вы запускаете программу, которая выполняется быстро, но вы используете только небольшое количество экземпляров, снова экономия будет несущественной. Однако, если ваша программа действительно тривиальна и требует минимального времени исполнения, возможно, вы заметите разницу.
Из вашего описания проблемы, похоже, это хороший кандидат на это. 10K с относительно короткой обработкой для каждого. xargs
может ускорить процесс для вас.
Однако, по моему опыту, выполнение любой нетривиальной работы в сценариях оболочки приносит боль. Если у вас есть имена каталогов или имена файлов, в которых может быть пробел, малейшая ошибка при цитировании ваших переменных приводит к сбою вашего сценария, поэтому вам необходимо навязчиво протестировать ваш скрипт, чтобы убедиться, что он будет работать на все возможные входы. По этой причине я делаю свои нетривиальные системные сценарии в Python.
Поэтому, если у вас уже есть ваша программа, работающая на Python, IMHO вы бы с ума сошли, чтобы попытаться переписать ее как скрипт оболочки.
Теперь вы можете использовать xargs
, если хотите. Просто используйте subprocess
для запуска xargs
и передайте все аргументы с помощью стандартного ввода. Это приносит пользу и ничто из боли. Вы можете использовать Python для вставки NUL-байта chr(0)
в конце каждого аргумента, а затем использовать xargs --null
, и он будет надежным с именами файлов, в которых есть пробелы.
В качестве альтернативы вы можете использовать ' '.join()
для создания собственных очень длинных командных строк, но я не вижу причин для этого, когда вы можете просто запустить xargs
, как описано выше.
Да, я уже делаю метод subprocess + xargs с одной из операций. Сама операция очень проста, стоимость менее 1 с. Я предполагаю, что это не практический вопрос, но с точки зрения масштаба я не нашел ни одного документа о том, есть ли какой-либо входной предел для xargs. Похоже, он просто завершает цикл вокруг ввода и способен выполнять команды в кусках. Это зависит от чего-то вроде буфера, который мне нужно настроить для его использования длинного списка ввода? – ttback
Мое понимание заключается в том, что xargs просто продолжает употреблять аргументы со стандартного ввода и добавлять их в командную строку до тех пор, пока линия не столкнется с лимитом или не исчерпается стандартный ввод. Как только он достигает предела, он запускает команду, а затем начинает создание другой командной строки для запуска. Есть возможность установить ограничение, но я думаю, что встроенный режим по умолчанию работает очень хорошо. Таким образом, xargs может обрабатывать любое количество входных аргументов, но может выполнять свою команду несколько раз, когда это произойдет. Больше информации здесь: http://offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html – steveha
Да, я прочитал это вчера. Поэтому я делаю поиск | xargs, я немного запутался в том, нужен ли мне флаг -s или -L (ограничение лимита против лимита) – ttback
- 1. Производительность многопроцессорности Python
- 2. Почему производительность многопроцессорности невидима?
- 3. Python: когда использовать потоки против многопроцессорности
- 4. Отсоединить подпроцесс, запущенный с использованием модуля многопроцессорности python
- 5. Тайм-аут многопроцессорности Python
- 6. NumPy против многопроцессорности и mmap
- 7. Python против Perl производительность сортировки
- 8. Python: использование многопроцессорности для разбиения графика
- 9. профилирование пула многопроцессорности python
- 10. Ошибка для многопроцессорности в Python
- 11. инструменты отладки python для многопроцессорности
- 12. Производительность многопроцессорности Python и psycopg2 с большим набором данных
- 13. Как взаимодействуют пакеты подпроцесса и многопроцессорности Python?
- 14. Подпроцесс Python
- 15. Сохранять данные только для чтения через работу через подпроцесс процесса многопроцессорности Python
- 16. Список Python против MySQL Выберите производительность
- 17. Функции многопроцессорности Python
- 18. Как проверить (сравнить) производительность Python против Clojure?
- 19. Ошибка трассировки многопроцессорности Python
- 20. Номер процесса многопроцессорности Python
- 21. Профилирование пула многопроцессорности python
- 22. Подпроцесс подпроцесса Python для stdin
- 23. Пример Python и многопроцессорности
- 24. Инициализация подкласса многопроцессорности Python
- 25. Возврат в многопроцессорности - Python
- 26. Производительность Threading Python против количества ядер
- 27. проблема блокировки многопроцессорности python
- 28. Пул многопроцессорности Python застрял
- 29. Python: установка многопроцессорности
- 30. задача планирования многопроцессорности python
http://ericlippert.com/2012/12/17/performance-rant/ «Если у вас есть две лошади, и вы хотите знать, какая из них быстрее, чем гонки ваших лошадей. краткие описания лошадей, опубликовать их в Интернете и попросить случайных незнакомцев угадать, что быстрее! » –
Я предполагаю, что стоимость «xargs» или «subprocess» будет настолько мала, что вы не заметите разницы. Или, если есть разница, это будет больше о том, какой из них лучше всего разделяет множество аргументов, а не тот, у кого есть наименьшие издержки. Но, как говорит Кристиан Темус, почему вы думаете, когда вы действительно можете узнать ответ? – abarnert
Я не спрашиваю случайных незнакомцев, но для людей, которые могут иметь опыт работы с подобными проблемами.спасибо в любое время. – ttback