Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Распаралелить обработку изображений (http://forum.oszone.net/showthread.php?t=343542)

ateka 04-01-2020 21:22 2903533

Распаралелить обработку изображений
 
Здравствуйте, мне нужна помощь в решении следующей задачи:
Надо периодически обрабатывать серии снимков накладывая на них серийный номер.
(на каждое изображение наносится номер начиная с единицы и так далее)
Выглядит очень упрощённо так:
Код:

for %%a in( *.png ) do (
set var=Счётчик+дата
magick %%a -клеим %var% .\output\%~nxa

Оказалось что обработка изображений задача весьма долгая.
На обработку ~400 картинок уходит ~30 минут.
(Там не просто текст приклеивается а хитрым образом обрабатывается для контраста.)
У машинки на которой выполняется эта задача четыре ядра и я подумал нет ли возможности
распаралелить задачу на четыре потока. Основная проблема что количество картинок всегда разное
и нужен серийный номер. Я батниках не совсем новичок но как решать подобную задачу не знаю.
Нужна помощь хотя бы на уровне алгоритма.

alpap 04-01-2020 21:50 2903538

с помощью cmd получится разве что разделить на 4 части для действий какого-то инструмента разделяющего ядра и понятно что это наоборот - еще увеличит общее время выполнения задачи.

DJ Mogarych 04-01-2020 22:37 2903550

Можно попробовать через ffmpeg с параметром -threads.

Iska 05-01-2020 00:27 2903558

ateka, картинки какой общий объём занимают? Можете ли Вы их выложить (пока не выкладывайте, вопрос задан как теоретический)?

Кроме того, покажите полный код Вашего пакетного файла. Всё ж, полчаса на наложение текста на 400 изображений (если они не по полгигабайта), на мой взгляд, многовато.

P.S. И что значит «серийный номер»? В чём его отличие от просто порядкового номера?

ateka 05-01-2020 08:52 2903581

Iska, я сначала тоже так думал но похоже в эту сторону копать бесполезно.
Картинки меньше 1М и дело именно в обработке. Приведу абстрактный пример:
Посмотреть картинку:

Как видно текст отлично виден на любом фоне но его обработка занимает много ресурсов.
Код для примера взят с сайта ИМ.
Скрытый текст

:: https://www.imagemagick.org/Usage/annotating/
convert -size 100x14 xc:none -gravity center \
-stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
-background none -shadow 100x3+0+0 +repage \
-stroke none -fill white -annotate 0 'Faerie Dragon' \
dragon.gif +swap -gravity south -geometry +0-3 \
-composite anno_fancy.jpg

Я ещё возможно спрошу на оффоруме но шансы невелики.
--------------------------------------------------------------------------------------------------
Я нагуглил следующее решение проблемы.
Есть такая утилита https://github.com/lordmulder/MParallel
Простая как бублик. Пример кода:
Скрытый текст
echo. >Build_01X1.txt
for %%a in (.\temp\*.png) do (
echo magick "%%a" -flip ".\output\%%~nxa" >>Build_01X1.txt
)
MParallel --input=Build_01X1.txt

Визуально видно что отрабатывает по четыре процесса.
Но прирост скорости даёт только вдвое. На машинке камень 2х2.
Видимо маджик умеет в гипертрединг.
Наверное вопрос можно считать решённым.
Но мне в принципе интересно каким образом распаралеливают задачи для батников.
Например я уверен что у уважаемого Мегаломана есть изящное решение.
Интересена не конкретика а алгоритм.

Iska 05-01-2020 10:25 2903595

Цитата:

Цитата ateka
Приведу абстрактный пример: »

Не надо абстрактный. Нужен конкретный.

Цитата:

Цитата ateka
Я нагуглил следующее решение проблемы. »

Попробовать можете, но особого толку от этого не вижу.

Цитата:

Цитата ateka
Видимо маджик умеет в гипертрединг. »

Разумеется, не «hyperthreading», а «multithreading», это совершенно различные понятия. Выполните:
Код:

magick.exe -version
и посмотрите, есть ли OpenMP во Features.

А так:
Цитата:

ImageMagick uses a single thread to read an image but multiple threads for image processing algorithms such as resizing.
Цитата:

Цитата ateka
Но мне в принципе интересно каким образом распаралеливают задачи для батников. »

Да точно так же, как, полагаю, и сделано по ссылке (не смотрел): создали последовательность команд, берём оттуда количество команд по указанной длине очереди, запускаем каждую на исполнение, и начинаем ждать завершения. Как только очередная команда завершилась — запускаем на исполнение следующую. И так до исчерпания последовательности. В нынешних ОС, насколько я понимаю, даже нет особой необходимости принудительно задавать Affinity, поскольку они сами подбирают наиболее подходящее в текущий момент ядро для исполнения потока.

ateka 06-01-2020 19:43 2903803

Цитата:

Цитата Iska
Попробовать можете, но особого толку от этого не вижу »

Толк в том что скорость обработки возросла вдвое.
Цитата:

Цитата Iska
посмотрите, есть ли OpenMP во Features »

Есть.
Цитата:

Цитата Iska
ImageMagick uses a single thread to read an image but multiple threads for image processing algorithms such as resizing. »

Похоже что это не так. Возможно подобный функционал включается отдельно.
Цитата:

Цитата Iska
создали последовательность команд... »

А как из одного батника запустить четыре задачи? Четыре раза start "" ?

alpap 06-01-2020 21:20 2903819

Цитата:

Цитата ateka
Четыре раза start "" »

Код:

@echo off
if "%~1" neq "" (call %*& exit /b)
call :# :#1
call :# :#2
call :# :#3
call :# :#4
exit /b

:#
 start "" cmd /c "%~f0 %*"
exit /b

:#1
 title C1
 start "" "process1"
exit /b

:#2
 title C2
 start "" "process2"
exit /b

:#3
 title C3
 start "" "process3"
exit /b

:#4
 title C4
 start "" "process4"
exit /b


Iska 06-01-2020 22:07 2903827

Цитата:

Цитата ateka
Толк в том что скорость обработки возросла вдвое. »

Значит, в Вашем коде (который Вы так и не хотите привести), возможно, не всё так оптимально.

Цитата:

Цитата ateka
Похоже что это не так. »

Так
Код:

magick.exe logo: -resize 2000% null:


Цитата:

Цитата ateka
А как из одного батника запустить четыре задачи? Четыре раза start "" ? »

Угу. Но пакетные файлы не слишком хорошо годятся для таких задач: сложно отслеживать завершение. Лучше пользуйте WSH/PoSH.


Время: 23:28.

Время: 23:28.
© OSzone.net 2001-