[gdal-dev] reading large image files

Even Rouault even.rouault at mines-paris.org
Wed Jul 16 15:03:33 EDT 2008


Stephen,

My first answer was "Maybe you have not waited long enough... ;-)"

But I could also reproduce the slowness with GDAL <= 1.5.2 while reading such 
a huge amount of data into one call.
There was an inefficient reading strategy in GDALRasterBand::IRasterIO that 
your dataset precisely hits, that is to say raster with big raster dimensions 
and tiled data. This is bug #2457 and it has been fixed recently in the SVN 
branch of 1.5 (in r14863) and trunk. I can confirm that updating to r14863 of 
branches/1.5 fixes the slowlyness.

So several solutions come to mind :
* try to read your file piece by piece (ideally by adjusting your requests on 
block boundaries)
* update to the SVN version 
* wait for the next release 
* try with GDAL_CACHEMAX=54, because 54 MB = 56 623 104 bytes > (1024 * 1024 * 
2) * (27552 / 1024). See #2457 for the explanation of that formula ;-) 

(Side note, I see one error in your code. You ask for GDT_Byte data but you 
allocate a float array. )

Best regards

Le Wednesday 16 July 2008 17:53:21 stephen tan, vous avez écrit :
> I have a nitf image that I am trying to read into an array using
> gdal-1.5.1.  The file is about 1.5G .
>
> gdalinfo returns the following information:
>     Size is 27552, 25196
>     ...
>     Band 1 Block=1024x1024 Type=UInt16, ColorInterp=Undefined
>
> I have tried to read the image into an array using the following code:
>     GDALDataset  *poDataset;
>
>     GDALAllRegister();
>
>     poDataset = (GDALDataset *) GDALOpenShared( fname.c_str(),
> GA_ReadOnly );
>     if( poDataset == NULL )
>     {
>         cerr << "Could not open file: " << fname << endl;
>         exit(1);
>     }
>
>     int width = poDataset->GetRasterXSize();
>     int height = poDataset->GetRasterYSize();
>     int bands = poDataset->GetRasterCount();
>
>     GDALRasterBand  *poBand;
>     int nBlockXSize, nBlockYSize;
>
>     poBand = poDataset->GetRasterBand( 1 );
>
>     poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
>
>     //float* data;
>     //data = (float *) CPLMalloc(sizeof(float)*width*height*bands);
>
>     float* data;
>     data = new float[width*height*bands];
>
>     //GByte* data;
>     //data = (GByte *) CPLMalloc(sizeof(float)*width*height*bands);
>
>     //GByte data[width*height*bands];
>
>     if(poBand->RasterIO( GF_Read, 0, 0, width, height, data, width,
> height, GDT_Byte, 0, 0 ))
>     {
>         cerr << "Error: Could not read image data." << endl;
>         exit(1);
>     }
>     GDALClose(poDataset);
>
> No errors are returned.  I let it run for several mins before I hit CTRL+C.
> Any C++ suggestions on getting the image into a 1D array and/or 2D array
> would be most helpful.  The above code works for smaller images.  I have
> also tried different GDALSetCacheMax with no success.
>
> Thanks
>
>
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev




More information about the gdal-dev mailing list