Сжатие изображения в виде байтового массива - PullRequest
0 голосов
/ 26 февраля 2019

Через некоторое время и после стресс-теста моей базы данных и его REST Api возникла следующая проблема:

Мы сохраняем изображения в виде байтового массива в базе данных Mysql через JPA / Hibernate , аннотированный какthis:

@Column(columnDefinition = "MEDIUMBLOB")
private byte[] photo;

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

Так что я ищу решение , чтобы сделать эти байтМассивы поменьше .Есть ли способ сжать изображение в виде байтового массива? Или другой подход был бы лучше, , возможно, разбиение по страницам (на мой взгляд, не самый лучший подход к задаче, которую мы должны решить)?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если изображения в формате JPEG, то качество сжатия фото будет на каждом желаемом уровне: высокое сжатие и низкое качество до обратного.Вы можете / должны ограничить размеры изображения (ширина и высота).См. ImageWriter ImageIO и параметры качества ImageIO.

Для больших двоичных объектов вы должны добавить:

@Lob
@Column(columnDefinition = "MEDIUMBLOB")
private byte[] photo;

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

Как уже упоминалось, можно также хранить изображения в файловой системе, возможно, под сгенерированным уникальным идентификатором:

UUID uuid = UUID.randomUUID();
String fileName = uuid.toString() + ".jpg";

В общем случае, используя поле byte[]или локальный объект неоптимален, так как он излишне заряжает сервер памятью.Сразу читать и писать в ответ лучше - вне JPA.Может быть, нативный запрос, если вы хотите что-то в базе данных.

0 голосов
/ 26 февраля 2019

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

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

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

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