Простой скрипт BASH, чтобы стать многопроцессорным -/'потоковым' сценарием BASH?

1) On what does this behavior depend? Is it some setting in package manager or the package itself decides whether it is enabled or not?

Каждый дистрибутив может использовать разные менеджеры пакетов, такие как apt в Debian или pacman в Arch Linux. Это требует от разработчиков программного обеспечения и/или сопровождающих пакетов подготовки пакета различными (зачастую непоследовательными )способами. Такие различия могут быть связаны с настройками в пакете, но иногда пакет может быть подготовлен без предположения, что systemd будет использоваться в целевой системе.

2) How can I change it?

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

2
22.06.2021, 02:28
2 ответа

Напишите свой сценарий так, чтобы он выполнял итерации по своим аргументам. Например:

#!/bin/bash

rhubarb='/hummdinger/LoCI/LoCI_orig/TSV/rhubarb-lip-sync-1.10.0-osx/rhubarb'
outdir='/hummdinger/LoCI/LoCI_orig/LOCI_GAME_FILES/Compiled/Windows/sync/'

for fn in "$@"; do
    bn=$(basename "$fn".wav)
    "$rhubarb" "$fn" -o "$outdir/$bn.tsv"
done

Сохраните это как, например, myscript1.shи сделайте его исполняемым с помощью chmod +x myscript1.sh.

Вы можете запустить это напрямую, но каждый файл будет обрабатываться последовательно. Вместо этого вы хотите запустить его с помощью GNU parallelили xargs -P. Например. со сценарием-оболочкой, подобным следующему, который делит количество обрабатываемых файлов на количество ядер, которые у вас есть.

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

Возможно, вы захотите жестко -закодировать что-то вроде cores=4или cores=8в приведенном ниже сценарии, а не использовать lscpu | awk..., как у меня (Я написал это так, потому что я использую threadripper 1950x с 16 ядрами и 32 потоками... и я не хотел запускать 32 задания параллельно. А также как пример того, как можно извлечь полезную информацию из lscpu).

Также рекомендуется :если у вас более одного диска, постарайтесь организовать все так, чтобы каталог, из которого вы читаете файлы.wav, находился на одном диске, а каталог, в который вы записываете файлы.tsv, находился на другом. Это устранит конфликт ввода-вывода между чтением и записью файлов. Если файлы.tsv невелики, запишите их во временный каталог на виртуальном диске tmpfs и переместите в окончательное место в конце сценария.

#!/bin/bash

wavdir="$1"

cores=$(lscpu | awk -F': +' '/^CPU\(s\):/ {cpus=$2};
                             /^Thread\(s\) per core:/ {tpc=$2};
                             END { print int(cpus / tpc) }')

count=$(find "$wavdir" -type f -name "*.wav" -print0 |
          perl -0ne '$c++;END{print $c}')

let files_per_thread=count/cores

find "$wavdir" -type f -name "*.wav" -print0 |
    xargs -0 -r -L "$files_per_thread" -P "$cores" /path/to/myscript1.sh

сохраните это как, например, myscript2.shи сделайте его исполняемым с помощью chmod +x myscript2.sh.

Это скрипт, который вы запускаете из командной строки, cron или чего-то еще. Он, в свою очередь, использует xargsдля параллельного запуска нескольких экземпляров myscript1.sh.

Запустите как:

./myscript2.sh /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/

Кстати,это использует NUL в качестве разделителя между именами файлов, поэтому безопасно использовать с любым именем файла (с использованием новой строки, поскольку разделитель имен файлов небезопасен, поскольку новая строка является допустимым символом в имени файла ).

-1
28.07.2021, 11:23

С помощью GNU Parallel вы можете сделать что-то подобное:

rhubarb=/hummdinger/LoCI/LoCI_orig/TSV/rhubarb-lip-sync-1.10.0-osx/rhubarb 

find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav" |
  parallel $rhubarb {} -o {.}.tsv

Или (, если вам действительно нужен вывод в другом каталоге):

find /hummdinger/LoCI/LoCI_orig/VO/WAV_Processed/ -name "*.wav" |
  parallel $rhubarb {} -o /hummdinger/LoCI/LoCI_orig/LOCI_GAME_FILES/Compiled/Windows/sync/{/.}.tsv
1
28.07.2021, 11:23

Теги

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