Ограниченная память обработки изображений на сервере - PullRequest
4 голосов
/ 13 апреля 2010

У нас есть серверное приложение (Java EE), оно будет выполнять некоторые задания по обработке изображений на основе запроса пользователя. Такие как преобразование формата изображения (например, TIFF в JPEG), преобразование цвета изображения (например, RGB в серый в BW), повторная выборка (изменение размера) изображения. Некоторые заказчики из полиграфической промышленности используют очень большие изображения, такие как 2000 точек на дюйм, 6 * 8 дюймов, 4 цветных компонента, что займет 6 *2000* 8 *2000* 4 = 768 МБ памяти. Сервер не может удерживать это большое изображение в памяти, поэтому мы решили сделать процесс чередованием. Проблема в том, что все еще не работает, потому что может быть много клиентов одновременно. Есть ли у вас какие-либо идеи о том, как реализовать обработку изображений с ограниченной памятью? Или вы знаете, если какие-то статьи / статьи могут дать нам решения.

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Я бы предложил переместить часть обработки изображений в отдельную JVM, с которой вы общаетесь из основного приложения, используя RMI или аналогичный.

Это позволяет настраивать обрабатывающую JVM отдельно от основной JVM и, возможно, даже создавать распределенную систему, если это необходимо, на нескольких машинах. Это также может позволить вам управлять конверсиями, чтобы в одно и то же время происходило только несколько изображений, позволяющих получать отдельные изображения большего размера.

Существуют ли какие-либо ограничения, которые не позволят вам сделать это?

В качестве последнего средства я бы предложил перенести фактические преобразования изображений в нативные программы, такие как ImageMagick в Linux, которая затем вызывается вашей программой, выполняет преобразование и позволяет вашей JVM передавать результат пользователю. Это, возможно, будет быстрее в обработке и потребует меньше памяти.

0 голосов
/ 14 апреля 2010

Вы можете использовать «плиточные» методы обработки изображений. Например, IPP поддерживает обработку мозаичных изображений.

0 голосов
/ 13 апреля 2010

Ну, первое, что вы должны знать, это то, что объем памяти, который вы можете выделить, не зависит от того, сколько у вас оперативной памяти. ОС управляет виртуальной памятью, а любое распределение выполняется в виртуальной памяти. Затем чанки выгружаются в RAM / Disk операционной системой. Вы не можете это контролировать. Вы можете подумать, что вы выделяете 5 МБ в оперативной памяти, но операционная система должна хранить ее в оперативной памяти или передавать ее с диска в вашу программу, когда вам это нужно. В Windows 32 bit у вас есть 2 ГБ в пользовательском пространстве для работы (остальное используется пространством ядра). В 64-битных ОС эта сумма намного больше.

Однако то, что у вас есть 2 ГБ пользовательского пространства, которое вы можете выделить (в 32-битной ОС или более в 64-битной), не означает, что вы всегда можете выделить такой большой кусок, потому что для выделения памяти требуются смежные блоки памяти. Таким образом, фрагментация памяти может стать проблемой.

В-третьих, JVM ограничивает объем памяти, который вы можете выделить. Поэтому вам нужно увеличить эти параметры на -Xms -Xmx, которые ограничивают размер кучи.

Кроме этих комментариев, у меня действительно нет решения для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...