Preparation is a separate cost
The four unchanged SKV objects took approximately 1–44 seconds to compile in historical measurements. These are not conversion timings of the current release candidate. Updates require a new immutable file.
A Rust engine for polygon statistics over raster data. Read TIFF and COG directly, or prepare a lossless SKV file for repeated queries.
Rust / Python / Node.js / CLI
Conceptual illustration · no source pixels
MEASURED AFTER PREPARATION
faster median queries than natural exactextract†
28 scenarios. Three observations each. Native Skarve with SKV summaries was faster in every scenario median in this frozen comparison.
One host · local files and unthrottled loopback HTTP · fresh readers, OS cache not evicted. Conversion is excluded. † Numerical policies differ.
Read the measurement limitsFROM SOURCE TO ANSWER
SKV stores typed raster samples and summaries in one self-contained file. Eligible queries can combine stored interior summaries with raw boundary reads.
Start with a TIFF, a Cloud Optimized GeoTIFF, or an existing SKV file.
infuseCompile a lossless, immutable file. Keep or archive the original according to your own provenance needs.
compileMeasure a single zone or consume an ordered batch across bands and raster slices.
carve · cleaveSum, fractional support, mean, minimum and maximum. A native engine with an optional exactextract compatibility backend; the benchmark below uses the native engine.
THE NUMBERS, IN MILLISECONDS
Seven fixed lanes, 588 completed operations. The headline always uses the summary-enabled SKV lane on the same prepared object.
1,025 × 1,031 cells · 40 bands · analytical data
Median milliseconds, three observations per case. Bars share a zero baseline within this view; shorter is faster. The complete table includes the observed SKV minimum and maximum.
† Natural exactextract has its own numerical policy. This is a performance comparison across policies, not a claim of bit-identical answers. Native controls use the same declared native comparison contract. See numerical details.
| Dataset / access | Polygons / bands | SKV median min–max | Best native median | Natural EE† median | EE speedup† |
|---|---|---|---|---|---|
| Generated 36HTTP (loopback) | 1 / 1 | 19.2118.22–20.00 | 38.60Tuned TIFF | 32.79 | 1.71× |
| Generated 36Local | 1 / 1 | 6.286.14–6.33 | 21.77Tuned COG | 29.08 | 4.63× |
| Generated 36HTTP (loopback) | 8 / 1 | 26.0526.03–26.27 | 42.52Tuned TIFF | 40.89 | 1.57× |
| Generated 36Local | 8 / 1 | 9.959.79–10.25 | 28.11COG + RSI256 | 36.20 | 3.64× |
| Generated 36HTTP (loopback) | 1 / 36 | 152.04151.37–152.42 | 404.33Tuned TIFF | 254.11 | 1.67× |
| Generated 36Local | 1 / 36 | 144.08129.75–156.06 | 249.00Tuned TIFF | 248.32 | 1.72× |
| Generated 36HTTP (loopback) | 8 / 36 | 271.75250.66–275.16 | 479.47Tuned COG | 374.98 | 1.38× |
| Generated 36Local | 8 / 36 | 234.11228.10–247.67 | 373.19Tuned COG | 366.07 | 1.56× |
| Generated 40HTTP (loopback) | 1 / 1 | 41.9341.73–42.50 | 66.90COG + RSI64 | 51.11 | 1.22× |
| Generated 40Local | 1 / 1 | 13.1212.46–13.63 | 31.82COG + RSI64 | 46.86 | 3.57× |
| Generated 40HTTP (loopback) | 8 / 1 | 70.1369.25–72.33 | 88.92Tuned TIFF | 80.64 | 1.15× |
| Generated 40Local | 8 / 1 | 24.6924.67–25.06 | 55.33COG + RSI64 | 76.70 | 3.11× |
| Generated 40HTTP (loopback) | 1 / 40 | 342.69335.42–350.73 | 1483.75Tuned TIFF | 1114.01 | 3.25× |
| Generated 40Local | 1 / 40 | 306.51304.69–307.14 | 733.89COG + RSI64 | 837.36 | 2.73× |
| Generated 40HTTP (loopback) | 8 / 40 | 691.50671.81–735.16 | 1696.16Tuned COG | 1595.75 | 2.31× |
| Generated 40Local | 8 / 40 | 630.61622.46–682.49 | 1275.97COG + RSI64 | 1369.90 | 2.17× |
| Real 36HTTP (loopback) | 1 / 1 | 22.1720.78–29.02 | 30.83Tuned TIFF | 27.46 | 1.24× |
| Real 36Local | 1 / 1 | 8.157.56–9.35 | 16.70Tuned COG | 22.99 | 2.82× |
| Real 36HTTP (loopback) | 8 / 1 | 28.7327.67–30.29 | 36.91Tuned TIFF | 35.25 | 1.23× |
| Real 36Local | 8 / 1 | 11.3810.79–11.52 | 20.04COG + RSI256 | 31.61 | 2.78× |
| Real 36HTTP (loopback) | 1 / 36 | 205.11204.40–217.92 | 399.78Tuned COG | 278.27 | 1.36× |
| Real 36Local | 1 / 36 | 167.05157.92–170.17 | 252.87Tuned TIFF | 212.31 | 1.27× |
| Real 36HTTP (loopback) | 8 / 36 | 313.17300.54–329.41 | 436.53Tuned COG | 387.50 | 1.24× |
| Real 36Local | 8 / 36 | 263.64263.13–270.52 | 387.53Tuned COG | 345.21 | 1.31× |
| WorldPopHTTP (loopback) | 1 / 1 | 35.0033.92–35.85 | 59.69COG + RSI64 | 52.91 | 1.51× |
| WorldPopLocal | 1 / 1 | 11.5211.16–11.68 | 25.05COG + RSI64 | 40.03 | 3.48× |
| WorldPopHTTP (loopback) | 8 / 1 | 66.6664.67–68.75 | 115.27COG + RSI256 | 201.81 | 3.03× |
| WorldPopLocal | 8 / 1 | 23.8223.68–24.48 | 50.97COG + RSI64 | 192.49 | 8.08× |
Enabling summaries was faster than the same-file raw ablation in 24 of 28 medians. Four local medians were slower. Download all 28 ablation medians; all control losses remain in the full report.
PERFORMANCE WITH CONTEXT
The four unchanged SKV objects took approximately 1–44 seconds to compile in historical measurements. These are not conversion timings of the current release candidate. Updates require a new immutable file.
The four SKVs total 82.21 MB; keeping their ordinary inputs brings the total to 150.08 MB. WorldPop SKV is about 22.1% larger than its natural COG control. Source and index storage is accounted separately.
SKV summaries won 83 of 84 individual comparisons with natural exactextract. The remaining Real 36 / one-band / one-polygon HTTP observation was 29.02 vs 27.46 ms, or 5.68% slower.
A separate controlled comparison retained 2–3% batch regressions and a 5.55% retained-query slowdown against an earlier Skarve build. Those observations are separate from the main 28 scenarios.
Clock: source open through fully serialized and consumed results, including metadata, summaries or indexes, reads, decoding, geometry and reduction. Imports and engine creation/close are reported separately. Data preparation is outside query time.
Environment: Ubuntu 24.04 under WSL2, AMD Ryzen 7 8745HS, one timed worker. Local or unthrottled loopback HTTP0, fresh process and reader. Input hashing can warm OS caches. This is neither a WAN nor an R2 benchmark; three observations do not establish p95 or cross-hardware confidence.
Native contract: exact IDs, order and null shape; absolute tolerance 1e-8 + relative 1e-10 × |reference|. All 504 native observations passed. All 84 natural observations passed their declared finite five-field contract.
Cross-policy differences: 29,244 finite field pairs and 2,076 both-null pairs, with no null-shape mismatch. 6,736 finite differences exceeded the native tolerance when applied diagnostically across policies. Maximum absolute differences: sum 0.135447025, support 0.000105156, mean 0.000005799; min/max matched here. These planar tests do not establish Horizon Mapper’s spherical-boundary or ordered-sum equivalence.
Frozen source: d15b0bccdf87654e6e6bd221ce114fb4f129e42d. Subsequent release documentation and the Rust consumer API have not been substituted into these timings.
| Source family | SKV MiB | With original MiB | Historical compile |
|---|---|---|---|
| Generated 40 | 23.59 | 40.14 | 6.01 s |
| Generated 36 | 5.50 | 9.76 | 1.10 s |
| Real 36 | 27.59 | 54.25 | 1.49 s |
| WorldPop | 21.72 | 38.97 | 44.26 s |
ONE SOURCE, AN EXPLICIT QUERY
This example opens the prepared SKV from Skarve’s generated example fixture and requests the native backend explicitly. The polygon uses that fixture’s EPSG:3857 grid.
It assumes the package is installed and example-data/snapshot.skv has already been compiled. Follow the source installation guide and generated-data walkthrough.
Also available through Rust, Node.js and the CLI.
from skarve import Skarve
zone = {
"type": "Polygon",
"coordinates": [
[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]
],
}
with Skarve() as engine:
with engine.infuse("example-data/snapshot.skv") as source:
result = source.carve(
zone=zone, crs="EPSG:3857", bands=[0],
metrics=["sum", "mean"], backend="native"
)
print(result["bands"][0]["fractional_sum"])BUILT BY FLORENT CHIF
Skarve is independent geospatial engineering, with a Rust core and Python, Node.js and CLI interfaces. SKV v0 remains experimental. The validated platform is Linux x86-64 on Ubuntu 24.04.
Open source under Apache-2.0. Source-only alpha.2 is available. Build from source; registry packages and prebuilt binary downloads are not yet available.
Used in Horizon Mapper. The qualified Belgium and France integration uses Skarve, with prepared SKV where eligible and COG fallback. The frozen benchmark above is separate from application performance and does not establish support for every country or source.
Repository · Rust · Python · Node.js · CLI
Horizon Mapper methodology