Lesson 23 / 28

Capacity Planning: Memory Is the Budget

Estimate RAM, disk and replicas before choosing hardware.

Vectors + graph + payload, times copies

Estimate in four parts: vector data (vectors × dimensions × bytes per number), index overhead (for HNSW roughly 2 × M × 4 bytes of links per vector, plus bookkeeping), payload/metadata (often significant if you store text), and replicas (multiply by the copy count). Then add headroom (30 to 50%) for growth, merges, and the OS cache. If it does not fit: quantise (int8, product quantisation) and keep full-precision vectors on disk for re-scoring; use fewer dimensions or a smaller model; keep payload text in another store; shard; or use a disk-based index. This is a rough planning model: real engines add their own overhead, so confirm with a load test on a representative sample before you buy hardware.

A capacity estimate, run

I ran this plain-Python (standard library only) example. The formula adds vectors, an estimated HNSW link overhead (M=16) and 500 bytes of payload per record, then doubles for 2 replicas. Ten million 768-dimension float32 vectors need about 37 GB for one copy and 74 GB with replicas; storing the numbers as int8 cuts one copy to 14 GB. These are planning estimates, not measurements of a specific engine.

def gb(x): return x / 1e9

def plan(n_vectors, dims, bytes_per=4, hnsw_m=16, replicas=2, payload_bytes=500):
    vectors = n_vectors * dims * bytes_per
    graph = n_vectors * hnsw_m * 2 * 4              # rough: ~2*M neighbour ids (4 bytes each) per vector
    payload = n_vectors * payload_bytes
    one_copy = vectors + graph + payload
    return one_copy, one_copy * replicas

for n, d, b in [(1_000_000, 768, 4), (10_000_000, 768, 4), (10_000_000, 768, 1), (100_000_000, 384, 1)]:
    one, total = plan(n, d, b)
    print(f"{n:>11,} x {d} dims, {b} byte/number: one copy {gb(one):7.1f} GB | with 2 replicas {gb(total):7.1f} GB")

Output:

  1,000,000 x 768 dims, 4 byte/number: one copy     3.7 GB | with 2 replicas     7.4 GB
 10,000,000 x 768 dims, 4 byte/number: one copy    37.0 GB | with 2 replicas    74.0 GB
 10,000,000 x 768 dims, 1 byte/number: one copy    14.0 GB | with 2 replicas    27.9 GB
100,000,000 x 384 dims, 1 byte/number: one copy   101.2 GB | with 2 replicas   202.4 GB

Quick check: What should you do after a paper capacity estimate?

  • Confirm with a load test on a representative sample
  • Buy hardware immediately
  • Ignore overhead
  • Skip replicas
Answer

Confirm with a load test on a representative sample — Engines add their own overhead; real measurements beat formulas.