Summary

GeoUtils performance benchmarks

Representative time and memory measurements for raster, vector and point cloud operations.

Commit a31a03838b63bb9e39d21d0d956c72f1bcad2282 on machine github-actions-x64-f56edd1d

How GeoUtils operations vary

Each comparison changes one option at a time. GDAL and PDAL CLI are separate external references.

GeoUtils operationThe task being measured, such as reprojection, filtering or gridding.
MethodThe algorithm selected for a specific operation.
Gridding — IDWGridding — Circular meanReprojection — Bilinear
Calculation engineThe library GeoUtils uses to carry out the calculation.
Rasterio / GDALSciPyNumbaNumPy
Execution modeHow an operation runs: in-memory or chunked out-of-memory.
EagerDaskMultiprocessing
Chunk strategyHow a chunked operation reconciles separate partial results.
Subsampling — SequentialSubsampling — Top-kPolygonization — Label stitchGrouped statistics — Dense / Sparse / Complete groups
External references: GDAL and PDAL CLIStandalone file-to-file commands run outside GeoUtils. GDAL covers raster and gridding operations, while PDAL covers raster point conversion and subsampling.

Performance table

Each row shows elapsed time and peak memory for a fixed workload (operation parameters and input size). All options run without parallelism: one computational process using one thread.

GDAL CLI reference. It appears only where a standalone GDAL command performs an equivalent operation. GeoUtils aims for comparable single-worker costs while supporting Python workflows, alternative engines and data larger than memory; it need not be faster for every isolated call. For reprojection, GDAL receives a memory budget based on the GeoUtils chunk size.

PDAL CLI reference. Raster point conversion uses a readers.gdal pipeline, followed by writers.ogr for GeoPackage or writers.las for LAS/LAZ. Subsampling adds filters.randomize with seed 42 and filters.head to match the requested output count. LAS/LAZ output maps the first raster band to native elevation.

Elapsed time Prepared inputs through completed output, including worker or CLI startup.Peak memory Highest combined memory of the benchmark process and its child workers.

Data-size context: a one-band 2,048² raster is 16.8 MB as Float32 (33.6 MB as Float64; 4.2 MB as UInt8), while 17² Float64 XYZ points are about 0.007 MB before object overhead.

Operation and methodReference workloadGeoUtils calculation engineGeoUtils execution modeExternal reference
Rasterio/GDALSciPyNumbaNumPyEagerDaskMultiprocessingGDAL CLI
Raster ⟶ Raster
Reprojection — Nearest2,048 × 2,048 input/output raster512 × 512 chunksTime1.05 sMemory443 MB———Time1.05 sMemory443 MBTime3.67 sMemory797 MBTime4.75 sMemory798 MBTime1.06 sMemory431 MB
Filtering — Mean2,048 × 2,048 raster1,024 × 1,024 chunks5 × 5 filter—————Time2.15 sMemory788 MBTime1.8 sMemory785 MB—
Raster ⟶ Point
Point interpolation — Linear2,048 × 2,048 source raster16,384 interpolated points512 × 512 chunks—Time0.075 sMemory403 MB——Time0.075 sMemory403 MBTime2.55 sMemory752 MBTime3.32 sMemory718 MB—
Subsampling2,048 × 2,048 source raster524,288 output points512 × 512 chunks—————Time4.05 sMemory994 MBTime10.7 sMemory936 MB—
Point cloud conversion1,024 × 1,024 source rasterone output point per cell512 × 512 chunks—————Time6.18 sMemory1.29e+03 MBTime8.61 sMemory992 MB—
Raster ⟶ Vector
Polygonization — Label stitch2,048 × 2,048 raster441 disconnected raster regions512 × 512 chunksTime0.145 sMemory501 MB———Time0.145 sMemory501 MBTime2.72 sMemory731 MBTime3.52 sMemory723 MBTime0.271 sMemory459 MB
Point ⟶ Raster
Gridding — Nearest2,048 × 2,048 output raster17 × 17 source points512 × 512 chunks—Time1.18 sMemory401 MBTime3.63 sMemory433 MB—Time1.18 sMemory401 MBTime5.2 sMemory794 MBTime4.56 sMemory764 MBTime1.69 sMemory423 MB
Gridding — Linear (Delaunay)2,048 × 2,048 output raster17 × 17 source points512 × 512 chunks—Time0.214 sMemory390 MB——Time0.214 sMemory390 MBTime4.3 sMemory796 MBTime3.51 sMemory767 MBTime0.119 sMemory423 MB
Gridding — Inverse-distance2,048 × 2,048 output raster17 × 17 source points512 × 512 chunks—Time1.4 sMemory431 MBTime0.197 sMemory488 MB—Time1.4 sMemory431 MBTime5.33 sMemory793 MBTime4.61 sMemory770 MBTime1.64 sMemory423 MB
Gridding — Circular mean2,048 × 2,048 output raster17 × 17 source points512 × 512 chunks—Time1.39 sMemory418 MBTime0.191 sMemory488 MB—Time1.39 sMemory418 MBTime5.48 sMemory793 MBTime4.59 sMemory767 MBTime0.456 sMemory423 MB
Vector ⟶ Raster
Rasterization2,601 source polygon features2,048 × 2,048 output raster512 × 512 chunksTime0.115 sMemory360 MB———Time0.115 sMemory360 MBTime2.45 sMemory724 MBTime3.43 sMemory716 MBTime0.0483 sMemory355 MB
Raster ⟶ Other
Grouped statistics — Moments — Dense summaries2,048 × 2,048 raster256 × 256 chunks64 local groupstwo values———Time0.388 sMemory778 MBTime0.388 sMemory778 MBTime3.62 sMemory736 MBTime12.5 sMemory959 MB—
Grouped statistics — Robust — Complete groups2,048 × 2,048 raster256 × 256 chunks64 local groupstwo values———Time0.433 sMemory673 MBTime0.433 sMemory673 MBTime6.43 sMemory739 MBTime11.6 sMemory992 MB—

Explore the results further