Предложение 1 - RAMdisk
Если вы хотите поместить все свои файлы в RAMdisk перед запуском, это должно значительно увеличить скорость ввода-вывода.
Таким образом, чтобы сделать 1GB Ramdisk, использование:
sudo mkdir /RAMdisk
sudo mount -t tmpfs -o size=1024m tmpfs /RAMdisk
Предложение 2 - Использовать формат MPC
Итак, если вы сделали предыдущий шаг, конвертировать все ваши изображения в формате JPEG в формате MPC файлов в RAMdisk. Файл MPC может быть удален в память без вашего процессора, нуждающегося в дорогостоящем декодировании JPEG, поскольку MPC - это тот же формат, что и . ImageMagick использует в памяти, но на диске.
Я хотел бы сделать это с GNU Parallel так:
parallel -X mogrify -path /RAMdisk -fmt MPC ::: *.jpg
-X
проходит как много файлов, как можно mogrify
без создания нагрузки convert
процессов. В документе -path
указано, куда должны идти выходные файлы. -fmt MPC
делает mogrify
конвертирует входные файлы в формат MPC
(Magick Pixel Cache), которые ваши последующие команды convert
в цикле могут считываться чистым DMA, а не дорогим декодированием JPEG.
Если у вас нет, или не нравится, GNU Parallel, просто опускаем ведущий parallel -X
и :::
.
Предложение 3 - Использование GNU Parallel
Можно также запустить @ код chepner в параллель ...
for ...; do
echo convert ...
done | parallel
По существу, я вторя все команды, вместо того, чтобы запускать их и список эховых команд затем выполняется GNU Parallel. Это может быть особенно полезно, если вы не можете скомпилировать ImageMagick с OpenMP, как предложил Эрик.
Вы можете поиграть с такими переключателями, как --eta
, после parallel
, чтобы узнать, сколько времени займет до конца, или --progress
. Кроме того, экспериментируйте с -j 2
или -j4
в зависимости от того, как большой ваша машина.
Я сделал несколько тестов, просто для удовольствия. Во-первых, я сделал 250 изображений JPEG случайного шума на 640x480, и пробежал код чекнера «как есть» - это заняло 2 минуты 27 секунд.
Затем я использовал тот же набор изображений, но изменил петлю на это:
for ((i=1, j=1; i <= num; i+=skip, j+=1)); do
echo convert "${files[@]:i:seqnum}" -evaluate-sequence mean ~/timelapse/Images/Shutterdrag/$j.jpg
done | parallel
время спускался до 35 секунд.
Тогда я поставил петлю назад, как это было, и изменил все входные файлы в MPC вместо JPEG, время снизилось до 36 секунд.
Наконец, я использовал формат MPC и GNU параллельно, как выше, и время сократилось до 19 секунд.
Я не использовал RAMdisk, поскольку я нахожусь на другой ОС от вас (и у вас очень быстрые диски NVME), но это тоже должно помочь вам. Вы также можете записывать выходные файлы в RAMdisk, а также в формате MPC.
Удачи вам и дайте нам знать, как вы справляетесь!
Как вы, кажется, читаете каждое изображение много раз, вам стоит подумать о создании RAMdisk (какую ОС вы используете?) И преобразовании всех ваших JPEG в файлы формата MPC в RAMdisk спереди, чтобы минимизировать нагрузку на декодирование - возможно, используйте GNU Parallel для этого тоже. –
Ubuntu 15.10 - это ОС, которую я использую. Есть ли простой способ настроить и использовать RAMdisk? – Markus
Вот пример http://www.hecticgeek.com/2015/12/create-ram-disk-ubuntu-linux/ –