Несколько операций с изображениями в одном процессе с помощью gm4javaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Несколько операций с изображениями в одном процессе с помощью gm4java

Сообщение Anonymous »

Этот вопрос об использовании библиотеки gm4java для взаимодействия с Graphics Magick (в scala).

Я тестировал PooledGMService, как это показано здесь, с помощью scala. , и он работает хорошо.

Однако я заметил, что он не работает так же, как пакетный режим в интерфейсе командной строки для gm (

Код: Выделить всё

gm batch batchfile.gm). Когда я запускаю пакетный файл GM из командной строки с любым количеством изображений, он запускает 1 процесс GM. Однако если я:

val config = new GMConnectionPoolConfig()
val service = new PooledGMService(config)
а затем делю экземпляр службы между 4 потоками, где я выполняю некоторую операцию над одним изображением в каждом потоке, например:

Код: Выделить всё

service.execute(
"convert",
srcPath.toString(),
"-resize", percent + "%",
outPath.toString()
)
Я вижу, что создаются 4 отдельных процесса GM.

Я считаю, что это влияет на производительность (тест с 100 изображений с упомянутым выше кодом по сравнению с gm cli с пакетным файлом занимают то же время, но мой код Scala использует в 4 раза больше ресурсов ЦП).

Мой вопрос это: как мне использовать gm4java, чтобы один процесс GM работает с несколькими изображениями (или, по крайней мере, с несколькими видами преобразований для одного и того же изображения), как и пакетный режим cli? Я предпринял несколько попыток (некоторые из них крайне глупые), но безуспешно.

Мой точный код Scala, если вам интересно, можно найти здесь.

обновление от 27.05.14

Под руководством комментария автора gm4java я понял что я тестировал две разные команды GM. Обновленные результаты сравнительного анализа:

Код: Выделить всё

100 x 30MB images (3.09GB tot)
on i7 quadcore (8 logical cpu's w/ hyper-threading)

Criteria            Time
gm cli batchfile    106s
my code 1 thread    112s
my code 4 threads   40s
my code 6 threads   31s
my code 7 threads   31s
my code 8 threads   28s
При ближайшем рассмотрении я также увидел, что во время работы моего кода одни и те же процессы gm с одинаковыми идентификаторами процессов все время поддерживались. Это облегчило мои опасения, что я теряю производительность из-за некоторых накладных расходов, связанных с запуском и завершением потоков GM.

Перефразирование

Думаю, суть моего вопроса в том, что сделать, чтобы gm4java работала как можно быстрее? Полезен совет о сопоставлении количества потоков с количеством механизмов выполнения машины. Есть ли что-нибудь еще, что приходит на ум?

Мой конкретный вариант использования — изменение размера входных изображений (в среднем 30 МБ, иногда 50–60 МБ и очень редко 100–500 МБ) несколько заданных размеров (миниатюры являются наиболее важными и приоритетными). Развертывание, вероятно, будет осуществляться на Amazon ec2 с 7 или 14 «вычислительными блоками»

Подробнее здесь: https://stackoverflow.com/questions/238 ... th-gm4java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»