2016-05-25 2 views
0

Я создаю анимированные GIF-файлы из нескольких исходных изображений с помощью Ruby. Мне нужно максимизировать пропускную способность/минимизировать время, затрачиваемое на создание каждого GIF. Я предпочел бы сохранить исходные изображения в памяти (возможно, Memcached), а не читать их с диска каждый раз, когда они мне понадобятся. Я использовал convert в backticks для выполнения команд imagemagick непосредственно из Ruby, например.Минимизировать активность диска с помощью rmagick или imagemagick

`convert -delay #{delay} -page #{w}x#{h}+0+0 src01.gif... etc` 

Я немного предпочитаю это более RMagick, как я нашел несколько примеров, я могу ссылаться на документы ImageMagick непосредственно. Кажется, что изображения, переданные команде convert, должны быть путями для изображений на диске. Кроме того, похоже, что результат преобразования commend - это путь к файлу, поэтому сгенерированное изображение будет записано на диск с помощью ImageMagick, и мне нужно будет прочитать его обратно с диска с помощью Ruby для доступа к результирующим данным изображения. Кажется, что я делаю ImageMagick каждый раз считывать исходные изображения с диска и записывать сгенерированный GIF на диск каждый раз. Я думаю, что это, вероятно, будет узким местом и ненужным, поскольку мне не нужно сохранять созданные изображения, которые мне просто нужно получить мгновенно.

Я заметил, что методы RMagick могут принимать Magick::Image s в качестве параметров вместо файловых путей. В этом случае я мог бы сохранить исходные изображения в памяти. Кроме того, RMagick возвращает сгенерированное изображение как данные в Ruby, что мне нужно, мне не нужно его записывать на диск.

Я имею в виду использование RMagick вместо

`convert...` 

для снижения активности диска.

Итак, вопрос 1: Имеет ли это смысл? Поскольку RMagick предположительно обертывает ImageMagick, является ли RMagick фактически чтением и записью на диск под капотом или у него есть какой-то способ использования ImageMagick без активности диска?

И вопрос 2: Есть ли способ получить данные изображения в и из команды преобразования ImageMagick без активности диска?

Надеюсь, что это имеет смысл. Просто пытаюсь обернуть мне голову и извиниться, если я не понимаю.

+3

Возможно, вы можете рассмотреть возможность создания небольшого RAMdisk в качестве одного из вариантов. –

+0

Конечно, вы можете также накапливать/генерировать изображения внутри Ruby и создавать анимированный GIF из последовательности ... не уверен в синтаксисе Ruby, но в PHP вы делаете 'addImage()' для каждого из фреймов, пока не будете полная последовательность, то вы делаете 'setImageDispose()' и 'writeImages (" animated.gif ", true)' –

ответ

1

Имеет ли это смысл?

Не совсем. Мы можем спорить о open fd и стоимости оболочек по сравнению с прямым API, но не было бы никакого дискового ввода-вывода между утилитой преобразования & RMagick.

Есть ли способ получить данные изображения в и из команды преобразования ImageMagick без активности диска?

ImageMagick отправляет stream утилита. Там не так много документации по использованию, но можно было бы использовать данные, чтобы извлечь данные изображения в blob, которые могут быть распределены через memcached.

Существует также протокол mpr: для обработки доступа к памяти на основе меток, но это может быть не распределенное решение, которое вы ищете. Плюс данные удаляются во время завершения процесса.

Лично отметьте комментарий к RAMdisk, я бы рекомендовал.Простая установка памяти/tmpfs легко настраивается в системе, и тогда просто нужно обновить конфигурацию policy.xml, чтобы использовать упомянутый mount в качестве временного каталога.

Смежные вопросы