Я написал скрипт bash в следующем формате:
#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"
rm -f $inFile $outFile
while read line
do
-- Block of Commands
done < "$inFile"
end=$(date +%s)
runtime=$((end-start))
echo "Program has finished execution in $runtime seconds."
while
Цикл будет читать $inFile
, выполнять некоторые действия на линии и сбросить результат $outFile
.
Поскольку $inFile
длина строки составляет более 3500 строк, выполнение сценария займет 6-7 часов. Чтобы минимизировать это время, я планирую использовать многопоточность или разветвление в этом скрипте. Если я создам 8 дочерних процессов, 8 строк из $inFile
них будут обрабатываться одновременно.
Как это может быть сделано?
shell-script
multithreading
parallelism
Мандар Шинде
источник
источник
Ответы:
GNU
parallel
создан именно для такого рода вещей. Вы можете запускать свой сценарий много раз одновременно, используя разные данные из вашего ввода для каждого:По умолчанию он порождает процессы в соответствии с количеством процессоров в вашей системе, но вы можете настроить его с помощью
-j N
.Особенно изящный трюк - это особенность упаковки. Если вы измените первую строку вашего Bash-скрипта на:
и подать данные на стандартный ввод, тогда все это произойдет автоматически. Это менее полезно, когда у вас есть код очистки, который должен выполняться в конце, что вы можете сделать.
Есть пара вещей, на которые стоит обратить внимание. Во-первых, он разделит ваш вход на последовательные блоки и будет использовать их по одному - он не чередует строки. Другая причина в том, что эти фрагменты разделены по размеру, независимо от количества записей. Вы можете использовать,
--block N
чтобы установить другой размер блока в байтах. В вашем случае, размер файла должен составлять не более одной восьмой. Ваш файл звучит так, как будто он может быть достаточно маленьким, чтобы в конечном итоге все это оказалось в одном блоке, что не соответствовало бы целиЕсть много вариантов для конкретных случаев использования, но учебное пособие описывает все очень хорошо. Опции, которые могут вас заинтересовать, включают
--round-robin
и--group
.источник
#!a b c
это приведет к["b c"]
, в то время как в некоторых других системах это приведет к["b", "c"]
.GNU parallel
для очистки страниц HTML. Не могли бы вы пройти через эту ветку unix.stackexchange.com/questions/277609/…