LINUX.ORG.RU

Параллельный запуск одного скрипта

 ,


0

1

Обработка .pdf файлов на заполненность страниц. Проблема в том, что файл на 80 страниц обрабатываю процессором E8400 за 22 сек., а на I7-2600 - за 19 секунд. 3-4 секунды - facepalm. Да, на одном ядре. Поэтому ищу способ запускать скрипт параллельно для обработки каждой страницы с выводом результата в отдельный файл для каждой страницы.

Есть два скрипта: mass_pdf.sh и script_pdf.sh.

Запуск ./mass_pdf.sh 456.pdf

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}

rm -f $fbname

n=$(gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit";) 
n=$(($n+1))
SECONDS=0
for ((i=1; i < $n; i++))
do
./script_pdf.sh "$1" $i $i >> $fbname;
done
echo $SECONDS > "${fbname}_"

script_pdf.sh

#!/bin/bash
gs -q -dNOPAUSE -dBATCH -dFirstPage="$2" -dLastPage="$3"  -sDEVICE=inkcov -o - "$1";

РЕШЕНИЕ: mass_pdf.sh:

#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
rm -f $fbname
n=$(gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit";) 
SECONDS=0
seq $n | parallel ./script_pdf.sh "$1" {} {} >> $fbname
echo $SECONDS > "${fbname}_"
#!/slavaisu

★★

Последнее исправление: abbat81 (всего исправлений: 2)

Ghostscript не знаю, но

https://ghostscript.com/doc/current/Use.htm#Improving_performance

dNumRenderingThreads=#

On a multi-core system where multiple threads can be dispatched to individual processors/cores, banding mode may provide higher performance since -dNumRenderingThreads=# can be used to take advantage of more than one CPU core when rendering the clist. The number of threads should generally be set to the number of available processor cores for best throughput.

anonymous
()
Ответ на: комментарий от anonymous

4 ядра 8 потоков на пике сделали свою работу без дополнительных флажков.

abbat81 ★★
() автор топика
Ответ на: комментарий от vertexua

Я уж думал, что про xargs никто не вспомнит...

vel ★★★★★
()
import concurrent.futures,multiprocessing,os,subprocess
def wrk(my_arg):
  subprocess.run(('my_command',my_arg),check=1)
p=concurrent.futures.ThreadPoolExecutor(
  multiprocessing.cpu_count())
p.map(wrk,(
  'job1',
  'job2',
  'job3',
  ...
  ))
p.shutdown()
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.