[gdal-dev] GDALWarpOperation.ChunkAndWarpImage slow on large tiffs

Even Rouault even.rouault at mines-paris.org
Wed Mar 9 14:13:29 EST 2011


Le mercredi 09 mars 2011 19:46:26, Radim Blazek a écrit :
> Hi,
> 
> GDALWarpOperation.ChunkAndWarpImage was reported to be extremly slow
> on larger geotiff (over 1GB). Is it possible that it is much slower
> with respect to GDALRasterIO()  even without reprojection? Should I
> return to 'manualy' reading data via GDALRasterIO() + fidling with
> data extents and cells alignement? I thought that GDAL
> ChunkAndWarpImage will do it even faster, possibly knowing better (?)
> various formats nature.

Yes, I wouldn't be surprised that ChunkAndWarpImage is noticeably slower if it 
is used only as a GDALRasterIO() replacement for the no reprojection case. 
There are quite a lot of extra processing that will be done to handle the 
nominal case of reprojection and you'll pay that cost even if you don't need 
it.

By reading the code of GDALCreateGenImgProjTransformer2(), namely 

    if( pszSrcWKT != NULL && strlen(pszSrcWKT) > 0 
        && pszDstWKT != NULL && strlen(pszDstWKT) > 0 
        && !EQUAL(pszSrcWKT,pszDstWKT) )
    {
        CPLString osSrcWKT = pszSrcWKT;
        if (hSrcDS 
            && CSLFetchBoolean( papszOptions, "INSERT_CENTER_LONG", TRUE ) )
            osSrcWKT = InsertCenterLong( hSrcDS, osSrcWKT );
        
        psInfo->pReprojectArg = 
            GDALCreateReprojectionTransformer( osSrcWKT.c_str(), pszDstWKT );
    }

you can see a small optimization in which the reprojection transformer isn't 
instanciated if the 2 SRS are identical. But the WKT strings must really 
match. We should perhaps use OSRIsEqual() instead to be more robust to minor 
differences in WKT. Dunno if you run into this however. And I don't know if 
this optimization accounts for much.

I've just run this non-scientifical benchmark (GDAL built with -O2) that 
confirms your findings :

$ time gdal_translate 
~/gdal/data/bmng/world.topo.bathy.200406.3x21600x21600.B2.tif out.tif
Input file size is 21600, 21600
0...10...20...30...40...50...60...70...80...90...100 - done.
real	0m12.102s
user	0m7.560s
sys	0m1.320s

$ time gdalwarp ~/gdal/data/bmng/world.topo.bathy.200406.3x21600x21600.B2.tif 
out2.tif
Processing input file 
/home/even/gdal/data/bmng/world.topo.bathy.200406.3x21600x21600.B2.tif.
0...10...20...30...40...50...60...70...80...90...100 - done.
real	1m13.387s
user	0m48.610s
sys	0m23.270s

where the source is a 21600x21600x3 JPEG-compressed TIFF with 256x256 tiles.

(with a unoptimized build, it is 14 s versus 3 minutes...)

> 
> Is there way to tune somehow performance? Currently no reprojection
> and GRA_NearestNeighbour.
> 
> Still the same code which I posted before
> http://trac.osgeo.org/qgis/browser/trunk/qgis/src/providers/gdal/qgsgdalpro
> vider.cpp?rev=15400#L625
> 
> Thanks for help.
> Radim
> _______________________________________________
> 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