atom feed7 messages in net.java.dev.imageio-ext.devOutOfMemoryError reading with MrSIDIm...
FromSent OnAttachments
Nidel, MikeJul 17, 2008 10:22 am 
Daniele RomagnoliJul 18, 2008 6:52 am 
Nidel, MikeJul 18, 2008 7:03 am 
Simone GiannecchiniJul 21, 2008 2:05 am 
Nidel, MikeJul 21, 2008 7:29 am 
Simone GiannecchiniJul 23, 2008 5:24 pm 
Nidel, MikeJul 23, 2008 8:17 pm 
Subject:OutOfMemoryError reading with MrSIDImageReader
From:Nidel, Mike (mike@lmco.com)
Date:Jul 17, 2008 10:22:11 am
List:net.java.dev.imageio-ext.dev

I reported earlier that I had been having memory problems when reading MrSID. Here is an example portion of the stack trace:

java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:99) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288) at it.geosolutions.imageio.gdalframework.GDALImageReader.readDatasetRaster( GDALImageReader.java:430) at it.geosolutions.imageio.gdalframework.GDALImageReader.readDatasetRaster( GDALImageReader.java:325) at it.geosolutions.imageio.gdalframework.GDALImageReader.read(GDALImageRead er.java:958) at javax.imageio.ImageReader.readAsRenderedImage(ImageReader.java:1560)

I dug in a bit further and realized that our application assumes that a RenderedImage implementation is available to delay reading of actual pixels. But as the stack trace shows, readAsRenderedImage isn't implemented in GDALImageReader or MrSIDImageReader. So the default implementation in ImageReader gets called which just passes through to ImageReader.read() (which IS implemented in GDALImageReader).

The problem with this is that read() returns a BufferedImage which means that the entire extent of the image is read into memory. For large images this is a problem.

I suppose the GDAL ImageReaders are intended to be used by decoding a single BufferedImage for each subregion/tile/block of the image. This is certainly feasible but it doesn't match the expectation of my existing application, to which the ImageIO-ext library is just a plugin. Right now we use RenderedImage.getTile() for pixel access.

Do you have a recommended solution for this? Is there any alternative to just putting an extra layer in between my app and GDAL/ImageIO-ext to convert getTile(x,y) requests to read() calls?

thanks,

Mike