2013-10-25 3 views
1

У меня вопрос о масштабируемости производительности с помощью xargs. В настоящее время у меня есть пакетная программа, написанная на питоне с многопроцессорностью и подпроцессом. Каждый процесс создает независимый subprocess.popen() для выполнения внешней команды. Недавно я понял, что весь процесс можно переделать с помощью xargs. Тем не менее, я задаюсь вопросом, стоит ли использовать xargs для обработки файлов 10k +, поскольку я никогда раньше не делал этого масштаба только с инструментами командной строки. Учитывая мой тест с небольшими наборами данных, на самом деле это не плохая идея, если все, что я делаю, это пакетный запуск множества команд, поскольку он избегает многих циклов накладных расходов, налагаемых модулями python, но я хотел бы узнать больше от тех, кто может иметь больше опыта работы с xargs и python. Более конкретно, существует ли какой-либо буферный лимит, который мне нужно настроить для xargs для потребления большого количества входов? Благодарю.Производительность для xarg против многопроцессорности python + подпроцесс

+1

http://ericlippert.com/2012/12/17/performance-rant/ «Если у вас есть две лошади, и вы хотите знать, какая из них быстрее, чем гонки ваших лошадей. краткие описания лошадей, опубликовать их в Интернете и попросить случайных незнакомцев угадать, что быстрее! » –

+0

Я предполагаю, что стоимость «xargs» или «subprocess» будет настолько мала, что вы не заметите разницы. Или, если есть разница, это будет больше о том, какой из них лучше всего разделяет множество аргументов, а не тот, у кого есть наименьшие издержки. Но, как говорит Кристиан Темус, почему вы думаете, когда вы действительно можете узнать ответ? – abarnert

+0

Я не спрашиваю случайных незнакомцев, но для людей, которые могут иметь опыт работы с подобными проблемами.спасибо в любое время. – ttback

ответ

2

Программа xargs будет собирать несколько аргументов со стандартного ввода и склеить их вместе, чтобы сделать одну длинную командную строку. Если для одной командной строки слишком много аргументов, слишком много, то она будет создавать и выполнять несколько команд, сколько угодно.

Это означает, что для запуска процессов и их закрытия требуется меньше накладных расходов. Насколько хорошо это будет для вас, зависит от продолжительности ваших процессов. Если вы запускаете какую-то программу с интенсивным процессором, которая будет работать в течение получаса, время запуска для процесса будет несущественным. Если вы запускаете программу, которая выполняется быстро, но вы используете только небольшое количество экземпляров, снова экономия будет несущественной. Однако, если ваша программа действительно тривиальна и требует минимального времени исполнения, возможно, вы заметите разницу.

Из вашего описания проблемы, похоже, это хороший кандидат на это. 10K с относительно короткой обработкой для каждого. xargs может ускорить процесс для вас.

Однако, по моему опыту, выполнение любой нетривиальной работы в сценариях оболочки приносит боль. Если у вас есть имена каталогов или имена файлов, в которых может быть пробел, малейшая ошибка при цитировании ваших переменных приводит к сбою вашего сценария, поэтому вам необходимо навязчиво протестировать ваш скрипт, чтобы убедиться, что он будет работать на все возможные входы. По этой причине я делаю свои нетривиальные системные сценарии в Python.

Поэтому, если у вас уже есть ваша программа, работающая на Python, IMHO вы бы с ума сошли, чтобы попытаться переписать ее как скрипт оболочки.

Теперь вы можете использовать xargs, если хотите. Просто используйте subprocess для запуска xargs и передайте все аргументы с помощью стандартного ввода. Это приносит пользу и ничто из боли. Вы можете использовать Python для вставки NUL-байта chr(0) в конце каждого аргумента, а затем использовать xargs --null, и он будет надежным с именами файлов, в которых есть пробелы.

В качестве альтернативы вы можете использовать ' '.join() для создания собственных очень длинных командных строк, но я не вижу причин для этого, когда вы можете просто запустить xargs, как описано выше.

+0

Да, я уже делаю метод subprocess + xargs с одной из операций. Сама операция очень проста, стоимость менее 1 с. Я предполагаю, что это не практический вопрос, но с точки зрения масштаба я не нашел ни одного документа о том, есть ли какой-либо входной предел для xargs. Похоже, он просто завершает цикл вокруг ввода и способен выполнять команды в кусках. Это зависит от чего-то вроде буфера, который мне нужно настроить для его использования длинного списка ввода? – ttback

+0

Мое понимание заключается в том, что xargs просто продолжает употреблять аргументы со стандартного ввода и добавлять их в командную строку до тех пор, пока линия не столкнется с лимитом или не исчерпается стандартный ввод. Как только он достигает предела, он запускает команду, а затем начинает создание другой командной строки для запуска. Есть возможность установить ограничение, но я думаю, что встроенный режим по умолчанию работает очень хорошо. Таким образом, xargs может обрабатывать любое количество входных аргументов, но может выполнять свою команду несколько раз, когда это произойдет. Больше информации здесь: http://offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html – steveha

+0

Да, я прочитал это вчера. Поэтому я делаю поиск | xargs, я немного запутался в том, нужен ли мне флаг -s или -L (ограничение лимита против лимита) – ttback

Смежные вопросы