Sto scrivendo un server FTP che riceve immagini e quindi le ridimensiona e le carica.Interfaccia utente per una sorta di immagine Java/Scala. Considerazioni sulle prestazioni
mio processo corrente (pseudocodice) è la seguente:
val imagesAsBytes: Array[Byte] = ...
val bufferedImage: BufferedImage = ImageIO.read(new ByteArrayInputStream(bytes))
uploadImage(bufferedImage)
Questo è l'essenza di esso. Ho omesso il ridimensionamento perché non è importante. In sostanza, serializzo lo Array[Byte]
in un BufferedImage
utilizzando il modulo ImageIO
e quindi lo ridimensiono.
Ho effettuato alcuni profili e ho notato che la creazione di un BufferedImage
utilizzando ImageIO
è terribilmente lenta.
Se ho appena caricato il Array[Byte]
, posso ottenere circa 4 volte il throughput, rispetto a se effettivamente provo a convertirlo in un BufferedImage
. Il motivo per cui non posso semplicemente caricare il Array[Byte]
, è che ho bisogno di ridimensionare l'immagine. Non sono legato a BufferedImage
, è solo il mio primo tentativo.
Qualcuno sa di alcune idee che posso usare per accelerare questo? C'è un formato migliore che dovrei usare su BufferedImage
?
Ho già pensato di ridimensionare il ridimensionamento su un microservice separato ed eseguirlo in modo asincrono, ma non è un'opzione per la prima versione.
Edit: ho rivisto this domanda, e sono consapevoli di questo: ImageIO.setUseCache(false)
Questo aiuto? http://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html – Allison
Non penso che decodificare un'immagine, ricampionarla (ridimensionandola) e infine ricodificare possa essere considerata lenta (4x) in base ai tuoi numeri. In realtà, è sorprendentemente veloce, rispetto al solo copiare i byte ... O era solo rispetto alla decodifica? Ad ogni modo, quale formato di file stai usando? Alcuni formati sono più pesanti da decodificare di altri. – haraldK