[gdal-dev] optimizing GTI performance (follow-up on #14063)

Vincent Schut schut at satelligence.com
Mon Mar 16 08:58:13 PDT 2026


This is a follow-up on https://github.com/OSGeo/gdal/issues/14063.

I decided to take it to the list instead, because I'm not sure whether 
this is an issue or simply a discussion on performance. (Let me know if 
you rather take this to gh issues again; happy to do so).

Please read the original issue first, to avoid wasting time on questions 
that were already answered there :-)

Short context: trying to get good performance out of a GTI mosaic which 
wraps (potentially a lot of) remote tifs (on AWS S3). The tifs are in 
UTM, the mosaic is reprojecting to epgs:4326.

After the performance optimizations made by Even as response to #14063 
(https://github.com/OSGeo/gdal/pull/14089 and 
https://github.com/OSGeo/gdal/pull/14094), I did some testing. The 
results were rather... confusing.

All these tests were done with a fresh gdal master build (GDAL 
3.13.0dev-28b33d81c7, released 2026/03/15).

What I expected (hoped):
- wrapping a (single) remote tif with a GTI should not affect 
performance too much
- gdal_translate to have better or similar performance on the GTI than 
gdalwarp, especially with using -oo WARPING_MEMORY_SIZE. As Even said, 
using gdalwarp means the warping logic is used twice, where it is only 
needed once. Using gdal_translate should therefore show better performance.

What I found:
- gdalwarp on the GTI is about 50% slower than on the remote tiff 
directly (but maybe that is simply the cost of having a GTI wrapper? I 
hoped it would be less)
- gdal_translate is still waaay slower (10x) than gdal_warp. Using 
WARPING_MEMORY_SIZE hardly seems to make a difference.
- this is only/mainly when targeting remote tifs. When using local 
files, the timings are very different. But: the remote case is the case 
we need, and what want to optimize. So I focus on that.

My tests were on a 22-core (according to "nproc") machine, 64G ram. 
Results will probably vary with number of cores, network speed, physical 
location (I'm in Europe, these tifs are probably in a bucket in the US), 
and also the size of the block extracted. All tests below extract the 
same 0.2 degree block.

These are the commands I ran as test:

# export config options
export GDAL_CACHEMAX=1GB GDAL_NUM_THREADS=ALL_CPUS 
DISABLE_READDIR_ON_OPEN=EMPTY_DIR 
CPL_VSIL_CURL_ALLOWED_EXTENSIONS="tiff" AWS_NO_SIGN_REQUEST=YES

# create a GTI wrapping 1 remote tif
gdal driver gti create --resolution 0.00006,0.00006 --ot Int8 
--band-count 64 --nodata -128 --dst-crs epsg:4326 --of gpkg 
/vsis3/us-west-2.opendata.source.coop/tge-labs/aef/v1/annual/2024/30N/xpzba7dllw4la2007-0000008192-0000000000.tiff 
test_1tiff.gti.gpkg

# start of tests
# each test extracts the same 0.2 x 0.2 degree block.

# gdal_warp on the remote tif directly, doing the exact same 
reprojecting as the GTI is doing
gdalwarp -overwrite -te -5.8 5.6 -5.6 5.8 -tr 0.00006 -0.00006 -t_srs 
epsg:4326 -wm 1G  -co tiled=yes -co blockxsize=512 -co blockysize=512 
-co interleave=band 
/vsis3/us-west-2.opendata.source.coop/tge-labs/aef/v1/annual/2024/30N/xpzba7dllw4la2007-0000008192-0000000000.tiff 
result_tiff_allbands.tif
# time: 0m33s

# gdalwarp on the GTI which wraps the same tif
gdalwarp -overwrite -te -5.8 5.6 -5.6 5.8 -wm 1G  -co tiled=yes -co 
blockxsize=512 -co blockysize=512 -co interleave=band 
test_1tiff.gti.gpkg result_gti_allbands.tif
# time: 0m47s

# gdal_translate on the GTI with -oo WARPING_MEMORY_SIZE set to 1G
gdal_translate -oo WARPING_MEMORY_SIZE=1GB -projwin -5.8 5.8 -5.6 5.6 
-co tiled=yes -co blockxsize=512 -co blockysize=512 -co interleave=band 
test_1tiff.gti.gpkg gt_result_gti_allbands.tif
# time: 5m31s

# gdal_translate on the GTI without the -oo WARPING_MEMORY_SIZE option
gdal_translate -projwin -5.8 5.8 -5.6 5.6 -co tiled=yes -co 
blockxsize=512 -co blockysize=512 -co interleave=band 
test_1tiff.gti.gpkg gt_result_gti_allbands.tif
# time: 5m16s

-- 

	

Vincent Schut

Remote Sensing Software Engineer

+31 302272679 ~ Maliebaan 22 | 3581CP | Utrecht | Netherlands

Linkedin <https://www.linkedin.com/company/satelligence/>~ 
satelligence.com <http://www.satelligence.com><http://www.satelligence.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20260316/6a818305/attachment-0001.htm>


More information about the gdal-dev mailing list