[gdal-dev] GDAL WKT Raster cache: Problem, options to solve and doubts

Frank Warmerdam warmerdam at pobox.com
Fri Aug 14 11:35:09 EDT 2009

2009/8/14 Jorge Arévalo <jorge.arevalo at gmail.com>:
>> Jorge,
>> I would note that one round trip per block is not necessarily so terrible
>> if the block size is reasonably large (128x128 or larger for instance).
> Yes, but don't you think it could be a good idea trying to avoid extra
> server rounds, in general?


It would be nice, but only as long as the complexity and risk is
appropriate to the benefit.

> Mmmm... I was studying the WCSDataset.cpp code and I thought that this
> might happen:
> - WCSDataset::IRasterIO calls GDALRasterBand::RasterIO
> - GDALRasterBand::RasterIO calls WCSRasterBand::IRasterIO
> - WCSRasterBand::IRasterIO calls WCSDataset::IRasterIO
> ....
> But I'm sure I'm making a mistake, a misunderstanding, because WCS
> driver is a solid, well tested driver.

I believe the WCS code is careful about this, only calling into
WCSDataset::DirectRasterIO() for cases that can be handled
directly (checked via a Test method).  This care is exactly to
avoid a looping recursion.

> Anyway, my idea is only to call
> IReadBlock as the "last resource". For this reason, I'd like to take
> advantage of the GDAL Data Model with this simple algorithm:
> WKTRasterDataset::IRasterIO(...)
> {
>   // Fetch all raster rows covered by the area requested
>   If I have rows:
>        // Get the data of these rows and copy it into the pImage
> buffer (byte swapping if needed)
>        // Anything more? return CE_None? add blocks to rasterband
> cache? delegate in GDALDataset::RasterIO?
>  else:
>      // Delegate in GDALDataset::RasterIO? This will derive in
> WKTRasterRasterBand::IReadBlock or not??
> }
> WKTRasterRasterBand::IRasterIO(...)
> {
>  poDS->IRasterIO(current band);
> }

> What's the normal way in which a program calls GDAL IO system. Is
> usual to call RasterIO directly? maybe call IReadBlock directly? What
> should a driver expect? Should a driver expect something as "usual"?

Normally applications call RasterIO() regardless of the underlying
format.  Direct block reads are very rarely done.

> I suspect that depends of the driver format...
>> I would note that the optimized IRasterIO() implementation is
>> not really necessary for a successful project though it would
>> certainly be a crowning achievement for the summer.
> Ok. I've quite a lot of code related with this concept (cache,
> IRasterIO...), but doesn't seem to works fine, for any reason. Maybe
> needs more discussion and/or thinking. I could put it off...

Well, please ensure that the more sophisticated machinery can
be easily disabled, getting back to a safely working block at
a time approach if needed.

Best regards,
I set the clouds in motion - turn up   | Frank Warmerdam, warmerdam at pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Programmer for Rent

More information about the gdal-dev mailing list