Байт-массив для какого-либо изображения Java/Scala. Требования к производительности
Я пишу FTP-сервер, который получает изображения, а затем изменяет размеры и загружает их.
Мой текущий процесс (псевдокод) выглядит следующим образом:
val imagesAsBytes: Array[Byte] = ...
val bufferedImage: BufferedImage = ImageIO.read(new ByteArrayInputStream(bytes))
uploadImage(bufferedImage)
Это суть этого. Я отказался от изменения размера, потому что это не важно. По сути, я сериализую Array[Byte]
в BufferedImage
с помощью модуля ImageIO
, а затем изменяю его размер.
Я сделал некоторое профилирование, и я заметил, что создание BufferedImage
с использованием ImageIO
очень медленное.
Если я просто загружаю Array[Byte]
, я могу достичь около 4x пропускной способности, чем если бы я на самом деле попытался преобразовать его в BufferedImage
. Причина, по которой я не могу просто загрузить Array[Byte]
, заключается в том, что мне нужно изменить размер изображения. Я не привязан к BufferedImage
, это только моя первая попытка.
Кто-нибудь знает некоторые идеи, которые я могу использовать, чтобы ускорить это? Есть ли лучший формат, который я должен использовать над BufferedImage
?
Я уже подумал о том, чтобы изменить размер в отдельном микросервисе и выполнить его асинхронно, но это не вариант для первой версии.
Изменить: я рассмотрел этот вопрос и знаю об этом: ImageIO.setUseCache(false)
Я бы предложил посмотреть более активно поддерживаемую библиотеку (последняя версия в мае 2016 года), например scrimage. Под капотом используется java.awt.*
. По крайней мере, в случае каких-либо проблем вы сможете обратиться к ним и получить их разрешение, более того, используя более "масштабируемый" API.
Надеюсь, что это поможет.