Запуск нескольких экземпляров Perl через xargs

Ну, первичный -mmin - это GNUism, который, скорее всего, не поддерживается в AIX, так как это глупое расширение по сравнению с тем, что использовали люди из BSD и я. как расширение уже в 1980-х годах. Учитывая тот факт, что sfind отлично компилируется в AIX, я рекомендую:

sfind . -mindepth 1 -type d -mtime +24h -exec rm -rf {} +

Код находится в schilytools по адресу: https://sourceforge.net/projects/schilytools/files/

5
26.03.2018, 20:15
3 ответа

Используйте xargsс -n 1, что означает «передавать только один аргумент при каждом вызове утилиты».

Что-то вроде:

printf '%s\n' file*.txt | xargs -n 1 -P 100 perl dataProcessing.pl

, который предполагает, что имена файлов не содержат буквальных символов новой строки.

Если у вас есть GNU xargsили реализация xargs, которая понимает-0(для чтения nul -аргументов с разделителями, что позволяет использовать имена файлов с символами новой строки )и -r(, чтобы не запускать утилиту с пустым списком аргументов, когда file*.txtничему не соответствует и nullglobдействует ), вы можете сделать

printf '%s\0' file*.txt | xargs -r0 -n 1 -P 100 perl dataProcessing.pl

Обратите внимание, что оба этих варианта могут запускать до 100 параллельных экземпляров скрипта, что может быть не совсем то, что вам нужно. Вы можете ограничить его до разумного числа, связанного с количеством ЦП на вашем компьютере (или связанным с общим объемом доступной оперативной памяти, разделенным на ожидаемое использование памяти для каждой задачи, если она привязана к памяти ).

12
27.01.2020, 20:31

Здесь не нужно выдумывать. В цикле bash for -просто запустите процесс perl:

for f in file*.txt; do
    perl dataProcessing.pl "$f" &
done
# wait for them to complete
wait
echo "All done."
5
27.01.2020, 20:31

GNU Parallel создан именно для этого:

parallel some_command {} ::: *.txt

По умолчанию используется одно задание на ядро ​​ЦП. Если вы хотите запустить 100 заданий параллельно:

parallel -j100 some_command {} ::: *.txt

Зная Perl, вы будете чувствовать себя как дома, используя даже более продвинутые функции GNU Parallel. Как вы думаете, что это делает:

parallel echo '{= s/(\d+)/$1*2/e; s/(.)/uc($1)/e; s/bar/baz/; s/foo/bar/ =}' \
  ::: 'my foo' 'i went to a baraar to get a 12" crowfoo'

GNU Parallel — это универсальный распараллеливатель, который позволяет легко выполнять задания параллельно на одной машине или на нескольких машинах, к которым у вас есть доступ по ssh.

Если у вас есть 32 разных задания, которые вы хотите запустить на 4 ЦП, прямой способ распараллеливания — запустить 8 заданий на каждом ЦП:

Simple scheduling

GNU Parallel вместо этого порождает новый процесс, когда он завершается -, сохраняя активность ЦП и, таким образом, экономя время:

GNU Parallel scheduling

Установка

Из соображений безопасности вам следует установить GNU Parallel с помощью вашего менеджера пакетов, но если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить персональную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, сделав это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Другие варианты установки см. вhttp://git.savannah.gnu.org/cgit/parallel.git/tree/README

Узнать больше

Посмотреть другие примеры:http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прохождение обучения:http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список рассылки, чтобы получить поддержку:https://lists.gnu.org/mailman/listinfo/parallel

2
27.01.2020, 20:31

Теги

Похожие вопросы