Spatial Archive Cost Modeling: Retrieval, Penalties & Compression

Modeling the true cost of a geospatial archive means combining four numbers that vendor pricing pages present separately: per-gigabyte storage, retrieval and request fees, early-deletion penalties, and the compression ratio that shrinks all three. This reference is for the data engineers, cloud architects, and compliance teams who must defend a storage budget and prove that a tiering decision saves money rather than merely relocating it. Default per-GB comparisons are misleading — a tier that looks ten times cheaper can cost more once restore fees, minimum-duration billing, and read amplification against poorly sized objects are counted. The tables and formulas below give you a single, auditable model that every section of this knowledge base can reference.

Cost is not a property of a storage class; it is a property of an access pattern applied to a storage class. The same 40 TB LiDAR collection is cheap in Deep Archive if it is read once a year and ruinous if a monthly reprocessing job restores it. Everything here is built to be plugged into that access pattern.

The Total Cost Model

Five cost components accumulate over an object’s life. Model them together, not in isolation:

Total cost of a spatial archive object over its lifetime A ledger diagram: five stacked cost components — storage, requests, retrieval, early-deletion penalty, and egress — sum to total lifetime cost. Compression ratio multiplies down the storage, retrieval, and egress rows because it shrinks the bytes those fees are charged against. Lifetime cost of one archived object Storage $/GB-month × compressed GB × months Requests PUT + GET + lifecycle transition counts Retrieval $/GB restore × compressed GB read Penalty unmet minimum-duration days billed Egress $/GB transfer out × compressed GB Σ total Lifetime cost per object × object count Compression ratio scales the Storage, Retrieval, and Egress rows: halve the bytes, halve those three fees.

The single most consequential lever is compression, because it reduces three of the five components at once. A 3:1 ratio on a vector archive does not just cut storage by two-thirds — it cuts every future restore and every egress byte by the same factor, compounding over the retention window. That is why compression tuning is a cost decision, not merely a storage decision, and why the Compression Tuning & Storage Optimization guides are upstream of every number here.

Storage Class Pricing Reference

The table below lists representative US-region list prices for the storage classes a spatial archive typically spans. Prices drift; treat these as the model’s default coefficients and override them with your contracted rates. What rarely changes is the shape: each step down in price buys a step up in retrieval latency and minimum-duration commitment.

Storage class $/GB-month Retrieval Min. duration Retrieval fee Typical spatial asset
S3 Standard ~$0.023 milliseconds none none active mosaics, live sensor feeds
S3 Standard-IA ~$0.0125 milliseconds 30 days ~$0.01/GB recent imagery, vector indexes
S3 Glacier Instant ~$0.004 milliseconds 90 days ~$0.03/GB quarterly-access rasters
S3 Glacier Flexible ~$0.0036 minutes–hours 90 days ~$0.01/GB + per-request historical project archives
S3 Glacier Deep Archive ~$0.00099 ~12 hours 180 days ~$0.02/GB legal-hold survey records, raw LiDAR

The per-gigabyte spread from Standard to Deep Archive is roughly 23:1, which is why aggressive cold-tiering is tempting. But the minimum-duration column is where naive models break: an object pushed to Deep Archive and deleted after 40 days still bills all 180 days. Choosing where an asset lands is the subject of Hot/Warm/Cold Tier Design for Geospatial Data, and the substrate that carries these classes is covered in Object Storage Selection for GIS Archives.

Early-Deletion Penalty Matrix

Every tier below Standard bills a minimum number of days regardless of how long the object actually lived. The penalty for deleting — or transitioning — an object early is the remaining unmet days at that tier’s storage rate. Model it explicitly before setting any hot-to-warm or warm-to-cold transition trigger:

Deleted/transitioned at Standard-IA (30d) Glacier IR (90d) Glacier Flexible (90d) Deep Archive (180d)
Day 10 20 days billed 80 days billed 80 days billed 170 days billed
Day 30 0 (met) 60 days billed 60 days billed 150 days billed
Day 90 0 0 (met) 0 (met) 90 days billed
Day 180 0 0 0 0 (met)

The practical rule this table encodes: never transition an asset into a tier whose minimum duration exceeds the time it will actually stay there. A dataset re-queried every 60 days should sit in Standard-IA, not Glacier — a too-aggressive rule that bounces it back to a hot tier on the next query pays the full 90-day Glacier minimum each round. Deriving transition days from real access telemetry rather than a static age cutoff is exactly the discipline in Setting Lifecycle Transition Thresholds from Query Telemetry.

Compression Ratio Reference

Compression ratio converts raw dataset size into the compressed bytes every storage, retrieval, and egress fee is actually charged against. Representative ratios for spatial data, measured against uncompressed source:

Source → archive format Codec Typical ratio Notes
Shapefile → GeoParquet ZSTD-3 4:1 – 8:1 columnar + dictionary-encoded attributes
Shapefile → GeoParquet ZSTD-19 6:1 – 12:1 higher ratio, ~5× compress CPU
GeoTIFF → COG DEFLATE 1.5:1 – 3:1 lossless; predictor 2 for continuous rasters
GeoTIFF → COG ZSTD 2:1 – 3.5:1 faster decode than DEFLATE at similar ratio
CSV attributes → Parquet Snappy 3:1 – 6:1 fast decode, lower ratio than ZSTD
LAS → LAZ (point cloud) LASzip 5:1 – 10:1 domain codec; COPC keeps range-read layout

Two attribute-level techniques amplify these ratios further: collapsing repetitive categorical columns with Dictionary Encoding for GIS Attributes, and matching the codec to the tier with the trade-offs in ZSTD vs LZ4 vs Snappy: Compression Trade-offs for Spatial Files. The exact level to run is governed by ZSTD Level Configuration for Spatial Files, because higher levels trade compress-time CPU for a smaller footprint — a cost you pay once against a saving you collect for the whole retention window.

A Worked Cost Model

The following script models the total lifetime cost of an archive under a candidate tiering plan. It uses realistic coefficients and a real access pattern, so the output is directly comparable across plans.

# spatial_archive_cost.py — model lifetime cost of one dataset under a tiering plan
RATES = {
    "STANDARD":     {"gb_month": 0.023,  "min_days": 0,   "retrieval_gb": 0.0},
    "STANDARD_IA":  {"gb_month": 0.0125, "min_days": 30,  "retrieval_gb": 0.01},
    "GLACIER_IR":   {"gb_month": 0.004,  "min_days": 90,  "retrieval_gb": 0.03},
    "DEEP_ARCHIVE": {"gb_month": 0.00099,"min_days": 180, "retrieval_gb": 0.02},
}
EGRESS_GB = 0.09  # data transfer out to internet

def object_cost(raw_gb, ratio, plan, restores, egress_restores):
    """plan = list of (storage_class, days_resident); restores = GB read from cold."""
    comp_gb = raw_gb / ratio
    storage = requests = retrieval = penalty = 0.0
    for cls, days in plan:
        r = RATES[cls]
        storage += r["gb_month"] * comp_gb * (days / 30.0)
        if days < r["min_days"]:                      # early-deletion / transition penalty
            penalty += r["gb_month"] * comp_gb * ((r["min_days"] - days) / 30.0)
    retrieval = sum(RATES[c]["retrieval_gb"] * comp_gb for c in restores)
    egress = EGRESS_GB * comp_gb * egress_restores
    return round(storage + requests + retrieval + penalty + egress, 2)

# 2 TB vector estate, 6:1 GeoParquet, 1 yr Standard-IA then 4 yr Deep Archive,
# restored from Deep Archive twice with one full egress:
plan = [("STANDARD_IA", 365), ("DEEP_ARCHIVE", 1460)]
print(object_cost(raw_gb=2048, ratio=6.0, plan=plan,
                  restores=["DEEP_ARCHIVE", "DEEP_ARCHIVE"], egress_restores=1))

Run it and compare plans side by side:

python3 spatial_archive_cost.py

Expected output — the modeled five-year cost of the 2 TB estate under this plan:

228.53

Swap ratio=6.0 for ratio=3.0 and the same command returns roughly double, making the compression-versus-cost relationship concrete: the storage, retrieval, and egress lines all scale inversely with the ratio, while the request line does not.

What Actually Appears on the Bill

Storage price per gigabyte is the line teams model and rarely the line that surprises them. A spatial archive’s invoice has five components, and their relative sizes depend far more on object count and access pattern than on total volume.

Monthly bill composition for a 400 TB spatial archive Five bill components as a stacked bar and a breakdown: storage at sixty-one percent, retrieval at nineteen, requests at twelve, egress at seven, and early-deletion penalties at one percent. 400 TB across three classes · 2.1M objects · $2,690/month storage · $1,640 · 61% retrieval $520 requests storage · $1,640 driven by volume and class mix lever: compression, precision retrieval & restore · $520 driven by how much each query pulls back lever: partitioning, object size requests · $310 driven by object count, not volume lever: object sizing egress · $180 driven by cross-region and external reads lever: colocate compute early deletion · $40 driven by transitions that moved too soon lever: threshold guardrails Retrieval and requests together are $830 — half the storage line, and the half that layout decisions actually control.

The request line is the one most often missing from a forecast, because it scales with object count rather than with volume and therefore does not appear in a model built from terabytes. An archive that halves its object size doubles that line without changing a byte of stored data — which is why partition resolution, row-group sizing and object consolidation belong in the cost model rather than in a separate performance discussion.

Cost Trade-off Analysis

Reading the model’s output back into decisions:

  • Storage dominates for cold, rarely-read data. For a 5-year Deep Archive object read once, storage is >90% of cost; shaving it with a higher compression level is the only meaningful lever.
  • Retrieval dominates for warm, frequently-read data. If a dataset is restored monthly, retrieval and egress can exceed a year of storage — keep it in Standard-IA or Glacier Instant, not Flexible or Deep Archive.
  • Penalties dominate for churning data. Assets rewritten or re-tiered before their minimum duration bleed penalty cost invisibly. Incremental update patterns like Incremental GeoParquet Updates Without a Full Rewrite exist partly to avoid rewriting cold objects that would trigger these penalties.
  • Object sizing changes request and read amplification. Millions of tiny partitions inflate PUT/GET counts and lifecycle-transition request fees; oversized objects amplify partial-read restore cost. Aligning file and row-group size to the retrieval tier is covered in Sizing Row Groups for Glacier Retrieval of GeoParquet.

Unit Economics: Cost per Terabyte-Year and per Query

Absolute monthly figures are hard to compare across archives and impossible to compare across years. Two normalised units make a cost model portable: the fully loaded cost of holding a terabyte for a year, and the cost of answering one typical query. Both are derived from the same components as the invoice, and both are stable enough to set targets against.

Cost per terabyte-year folds storage, the amortised share of ingest and conversion compute, and the standing integrity-verification reads into one number. Cost per query folds retrieval, requests and egress, divided by the query count over the same period. Reported together they expose the trade the archive is actually making: aggressive tiering pushes the first number down and the second up, and the right balance depends entirely on how often the archive is read.

Cost per terabyte-year against cost per query for four configurations Four archive configurations plotted on two axes: storage cost per terabyte-year falls from 276 dollars for all-standard to 34 for all-deep-archive, while cost per query rises from 4 cents to 210 cents. A note gives the query rate at which the tiered configuration stops being cheapest. configuration$/TB-year$/querycheapest when all STANDARD $276 $0.04 read constantly STANDARD + IA $198 $0.06 read weekly tiered incl. GLACIER $92 $0.18 read a few times a year all DEEP_ARCHIVE $34 $2.10 essentially never read Break-even: the tiered configuration is cheapest overall up to about 900 queries per TB per year; above that, IA wins. Query rate, not volume, is the variable that selects a configuration — and it is the one most cost models omit.

Track both numbers per collection rather than for the archive as a whole. A single blended figure hides the collection that is being read a thousand times a year from Deep Archive, which is usually where the largest available saving sits — not in shaving the storage price of everything, but in moving one mis-tiered collection to the class its access pattern actually calls for. The full restore-cost arithmetic behind the per-query column is worked through in Modeling the Cost of a Full Archive Restore.

Forecasting a Growing Archive

An archive’s cost is not a level but a slope, and the slope has two parts that behave differently. New data arrives at some rate and is billed from the day it lands; existing data ages into cheaper classes on the schedule the lifecycle rules set. A forecast that models only the first produces a straight line that overstates cost within two years; one that models both produces the characteristic flattening curve that lets a team commit to a budget.

The inputs are few and all measurable: the annual ingest volume, the compression ratio the pipeline achieves, the transition schedule, and the retention period after which anything is actually deleted. The output worth reporting is the year in which the cost curve flattens — the point where the volume ageing into archive classes matches the volume arriving — because that is the number a finance conversation actually turns on. Detailed multi-year projections, including how retention expiry eventually caps the curve, are built in Forecasting Multi-Year Storage Costs for Growing Imagery Archives.

Two sensitivities dominate any such forecast. Compression ratio scales the whole curve linearly, so a pipeline improvement that raises the ratio from 3:1 to 4:1 removes a quarter of every future year’s storage line — which is why compression tuning is a budget decision and not only an engineering one. Transition timing shifts the curve’s shape rather than its level: moving the hot-to-warm boundary six months earlier saves a predictable amount and pulls forward the minimum-duration clock on everything it touches, so the saving is real but smaller than the price difference suggests.

Compliance & Retention Cost Interaction

Retention requirements set a floor under the model. When a regulatory mandate forces a 10-year hold, the cost question narrows to “the cheapest class whose minimum duration and retrieval SLA I can tolerate for 10 years.” Object Lock in COMPLIANCE mode, detailed in Configuring S3 Object Lock for Compliance Spatial Archives, removes early deletion from the table entirely for the locked window — which means the early-deletion penalty column becomes irrelevant and Deep Archive’s low storage rate wins outright, provided the ~12-hour restore is acceptable for audit response. Model the retrieval fee against the realistic number of audit or legal-discovery restores per year, not the theoretical maximum. Consult the official AWS S3 storage pricing documentation and S3 Storage Classes documentation for authoritative current coefficients before committing a budget.

Attributing Cost to the Teams That Cause It

A single archive bill tells nobody what to do. The same total looks like a storage problem to the platform team, a query problem to the analysts, and an unavoidable cost to finance — and all three readings can be defended from the same invoice. Attribution is what turns the number into a decision, and it is a tagging exercise rather than an accounting one.

Three tag dimensions cover almost every question worth asking. A collection or dataset tag attributes storage and retrieval to the material itself, which is what identifies a mis-tiered collection. An owning-team tag attributes it to whoever decides how that material is used, which is what makes a query pattern someone’s to change. A retention-class tag separates the portion of the bill that is a business choice from the portion mandated by a statute or a contract — a distinction that matters enormously in a budget conversation, because one is negotiable and the other is not.

The mechanics are ordinary: apply the tags at ingest in the same job that writes the object, enforce their presence in the same gate that validates the reference system, and pull cost-allocation reports against them monthly. What makes the exercise worthwhile is the second-order effect. When a team can see that its habit of restoring a whole collection to answer a bounded question costs a measurable amount every month, the fix — a better partition layout, or a warm derivative — becomes something they ask for rather than something the platform team has to argue for.

Two attribution traps are worth naming. Shared reference data has no single owner and will otherwise land on whoever ingested it, so give it an explicit steward and treat its cost as an overhead line rather than distributing it. And restore costs are caused by the reader, not by the collection, so attribute them to the requesting team even though the storage line sits with the data — otherwise a well-run collection looks expensive because someone else keeps pulling it out of Deep Archive.

Where Cost Models Go Wrong

Most archive cost models fail in one of four predictable ways, and all four are cheap to avoid once named.

The first is modelling volume and ignoring object count, which omits the request line entirely and understates the cost of a finely partitioned archive by a fifth or more. The second is using list prices without minimum billable sizes and durations, which is accurate for large objects and badly wrong for archives made of small ones — a 40 KB minimum applied to 12 KB tiles nearly triples their effective storage cost. The third is assuming a query rate rather than measuring one; access logs almost always show a distribution with a long tail of heavily read collections that the average conceals. The fourth is forecasting storage growth without modelling retention expiry, which produces a curve that rises forever and is therefore ignored by everyone who reads it.

A model that avoids those four is usually accurate to within about ten percent of the invoice, which is close enough to drive decisions. Beyond that point, the remaining error comes from things worth ignoring — regional price differences of a fraction of a cent, free-tier allowances, negotiated discounts — none of which change which lever to pull next.

Operational Execution Checklist

Frequently Asked Questions

What is the single largest lever on a spatial archive’s cost?

Compression ratio, because it multiplies through every other line — storage, retrieval, and egress all scale with the compressed size. A pipeline moving from an untuned default to entropy-matched levels with coordinate rounding routinely halves the archive, and that halving applies for the full retention window. Partition and object sizing come second, and they act on the retrieval and request lines rather than on storage.

How should shared costs like ingest compute be attributed?

Amortise them into the cost per terabyte-year rather than reporting them separately. Conversion compute is paid once per byte archived and is genuinely part of what it costs to hold that byte for its lifetime; showing it as a separate one-off line encourages the false conclusion that a cheaper conversion is always better, when a slower conversion producing a better ratio usually wins over a multi-year horizon.

Do these figures transfer between cloud providers?

The structure does, the numbers do not. Every provider bills for storage, retrieval, requests and egress, and the relative importance of those lines for a spatial archive is similar everywhere. The specific rates, minimum durations, minimum billable sizes and per-object overheads differ enough that a model built for one provider will misprice another by tens of percent — most often on the request and overhead lines rather than on the headline per-gigabyte price.

How often should the cost model be re-run?

Quarterly against actual invoices, and immediately after any change to partitioning, compression, or lifecycle thresholds. The value of the model is not its forecast but the gap between forecast and actual: a growing gap means one of the assumptions — usually query rate or object count — has drifted, and finding out which is far easier quarterly than annually.

Who should own the cost model?

The team that operates the archive, reviewed with whoever owns the budget. A model maintained by finance alone drifts from the technical reality that drives it — object counts, compression ratios, transition schedules — while a model maintained only by engineers rarely gets connected to the invoice it is supposed to predict. The productive arrangement is engineering maintaining the model and finance reconciling it quarterly against actuals, with the gap between the two treated as the interesting signal.

What does a good cost review actually change?

Usually one of three things: a collection moves class because its measured access rate does not match where it sits, an object layout is consolidated because the request line has grown faster than the storage line, or a compression setting is revisited because a newer pipeline achieves a materially better ratio on the same data. If a quarterly review changes none of those and simply reports the number, the model is being maintained rather than used.

Part of the Spatial Data Archival knowledge base.