Benchmarks
DreamDB vs LanceDB and Deep Lake (head-to-head), plus lakeFS (versioning, qualitative). We compare DreamDB to its actual category — versioned, multimodal, object-store-native data lakes with built-in retrieval — not pure vector servers (Qdrant/Milvus), which are a different category and would measure DreamDB's weakest axis.
Python 3.12 · single Apple-silicon machine · local-disk · cosine · k=10 · warm latency. SIFT1M (1M×128) + real CLIP-512 (openimages).
What makes DreamDB unique
On raw vector retrieval DreamDB is competitive but not categorically faster (below). Its real differentiation is the data model — capabilities none of the others offer together:
Time is the only key
Every record is anchored on a nanosecond timeline — temporal- and streaming-native. Episodes, sensor logs, and replay are first-class, not bolted on. LanceDB / Deep Lake / lakeFS have no such model.
Multimodal on one timeline
Video (CMAF, segmented + seekable), images, embeddings, scalars, and text time-aligned on a single timeline. Robotics / AV sensor-fusion fits natively — not as separate tables.
Every retrieval mode, one engine
Vector ANN + BM25 + SPLADE (learned-sparse) + ColBERT (late-interaction) + hybrid fusion. SPLADE and ColBERT are unique here — no other system in the set offers them.
Serverless, in-browser reads
Queries — including ANN — run client-side in the browser, directly against S3. No server, no backend. This very demo is the proof. None of the others read in-browser.
A protocol, not a library
Content-addressed + immutable, with git-style branch / merge / time-travel at the data-model level, over any S3-shape store — designed for interoperating implementations.
The wedge is the intersection. Each of these exists somewhere else in isolation — but versioned + temporal + multimodal + multi-modal retrieval + serverless, in one content-addressed store, is the combination only DreamDB offers. That's the case for embodied-AI / robotics episodic memory — not winning a single-axis race against a tuned vector server or an analytics warehouse.
Iso-recall — latency at equal recall (CLIP-512, 25k)
The fair comparison: tune each system's search effort to the same recall, then compare latency (lower-left of a curve is better). LanceDB uses nprobes+refine_factor; DreamDB uses its query-time nprobe knob; Deep Lake has no query knob (single point).
At moderate recall LanceDB is a touch faster; at ~0.99 the two are neck-and-neck (LanceDB ~5.8 ms, DreamDB ~6–10 ms); DreamDB reaches marginally higher recall (0.997). Both are far below Deep Lake's fixed ~12 ms. At 25k all three are close — the separation sharpens at 1.7M (below).
At scale — 1.74M CLIP-512 (k=10)
25k is near-trivial; scale is where architectures separate. On the full 1.74M-vector openimages corpus, latency (p50) at each recall target. DreamDB is competitive with LanceDB and shown compacted (the operating state after a bulk load):
| recall target | LanceDB | DreamDB | Deep Lake |
|---|---|---|---|
| ≥ 0.90 | 5.56 ms | 6.58 ms | — |
| ≥ 0.95 | 7.24 ms | 9.55 ms | — |
| ≥ 0.99 | — (caps ≈0.95) | 27.6 ms | — |
DreamDB recall 0.943 / 0.973 / 0.993 at np16 / np32 / np128. Deep Lake's binary path collapses to a brute-force scan at this size — recall 0.51 @ 1.74 s, failing every target. Storage ~3.6 GB all (DreamDB 4.2 GB with rerank; 7.9 GB transiently post-compact, pre-gc).
Read. At 1.74M, DreamDB is within ~1.2× of LanceDB at recall 0.90 and ~1.3× at 0.95, and is the only system to cleanly reach ≥0.99 (LanceDB's PQ plateaus ≈0.95; Deep Lake degrades to a linear scan). Latency scales gently with N (100k 2.9 ms → 800k 4.9 ms → 1.74M 6.58 ms at recall ≈0.94). A bulk load should be followed by compact() — lossless and recall-identical.
Compaction — bulk-load maintenance (1.74M)
A bulk ingest commits in batches, and each commit writes one bucket fragment per IVF cell — so a cell ends up split across ~80 fragments and every query pays to read them all. compact() (spec/0021) merges each cell's fragments back to one: read-online, lossless. Measured before/after on the 1.74M corpus (same dataset + queries; collapsed 96,872 fragments across 1,256 cells in 7.9 s):
| nprobe | recall@10 | p50 uncompacted | p50 compacted | speedup |
|---|---|---|---|---|
| 16 | 0.943 | 24.5 ms | 6.6 ms | 3.72× |
| 32 | 0.973 | 43.3 ms | 9.6 ms | 4.53× |
| 64 | 0.988 | 82.1 ms | 16.2 ms | 5.06× |
Recall is bit-for-bit identical (lossless merge) — fragmentation is the dominant cost of a raw bulk load, so merging fragments back to one per cell is the key post-ingest step, and the compacted column is the operating state in the at-scale table above. Caveat: compaction is copy-on-write, so on-disk footprint temporarily ~doubles (4.2 → 7.9 GB) until a gc pass reclaims the old fragments — compact + gc is the full maintenance cycle.
Random access by key (point lookup)
The episodic-memory workload: fetch a record by its time anchor (not similarity search). DreamDB uses a primary-key (time-anchor) index; LanceDB a columnar take. p50 by corpus size:
| N | DreamDB (PK index) | LanceDB |
|---|---|---|
| 200k | 0.07 ms | 0.10 ms |
| 800k | 0.07 ms | 0.10 ms |
| 1.74M | 0.10 ms | 0.18 ms |
Flat (O(log N), N-independent) — ~0.07–0.10 ms across the full 20k→1.74M range, on par with (or ahead of) a columnar take. The PK index (`build_anchor_index` → `get_by_anchor`: root → leaf → one ranged record GET) replaces the naive temporal scan, whose fan-out grew ~√N (5.5 ms @200k → 17 ms @800k → 35 ms @1.74M → seconds at 10B). A primary key now has a primary index.
Capability matrix
| DreamDB | LanceDB | Deep Lake | lakeFS | |
|---|---|---|---|---|
| ✓ | ✕ | ✕ | ✕ | |
| ✓ | ✕ | ~ | ✕ | |
| ✓ | ✕ | ✕ | ✕ | |
| ✓ | ~ | ✕ | ✕ | |
| ✓ | ✕ | ✕ | ✕ | |
| ✓ | ✓ | ✓ | ✕ | |
| ✓ | ✓ | ~ | ✕ | |
| ✓ | ~ | ✓ | ✓✓ | |
| ✓ | ✓ | ✓ | ~ | |
| ✕ | ✓ | ~ | ~ | |
| ~ | ✓ | ✓ | ✕ | |
| ✕ | ✓ | ✓ | n/a | |
| v0 | high | high | high |
✓ native · ~ partial · ✕ no. Click any capability for an explanation. Unique to DreamDB vs both LanceDB and Deep Lake: the top five rows.
CLIP-512 — DreamDB's target (25k, k=10)
| system | recall@10 | storage | p50 latency |
|---|---|---|---|
| DreamDB (nprobe 64) | 0.997 | 53.6 MB | 9.7 ms |
| LanceDB (refine) | 0.989 | 52.9 MB | 5.8 ms |
| Deep Lake | 0.994 | 51.3 MB | 12.1 ms |
High-dim normalized embeddings — DreamDB's design point. All three reach ~0.99 recall; differences are latency + the tunable curve above.
SIFT1M — low-dim L2 (1M×128, k=10)
| system | recall@10 | storage | p50 latency |
|---|---|---|---|
| LanceDB IVF_PQ | 0.535 | 534 MB | 1.3 ms |
| Deep Lake binary | 0.425 | 534 MB | 2.3 ms |
| DreamDB 1-bit | 0.214 | 677 MB | 27 ms |
| DreamDB 4-bit | 0.803 | 721 MB | 26 ms |
Adversarial for a cosine + 1-bit design. 1-bit DreamDB is weak here (0.21); 4-bit reaches 0.80 — ahead of LanceDB (0.54) and Deep Lake (0.43) — trading ~1.35× storage and higher latency. SIFT was a config (bit-depth), not a fundamental loss.
Honest takeaways
- Retrieval: competitive on embeddings once tuned; LanceDB usually a touch faster at equal recall, both beat Deep Lake on latency.
- Competitive at scale: at 1.74M DreamDB is ~1.2× LanceDB at 0.90 recall (6.58 vs 5.56 ms), uniquely still reaches ≥0.99, and Deep Lake collapses to a brute-force scan. A bulk load wants a
compact(+gc) pass — lossless and recall-identical. - Remaining costs: slower ingest (per-batch commits), a
gcpass aftercompact, and no high-QPS serving layer (out of scope by design). - The wedge is the model: versioned + temporal + multimodal + multi-modal retrieval + serverless/in-browser — the intersection none of the others offer together.
- Not a tabular analytics warehouse (LanceDB), a training-loader lake (Deep Lake), or an enterprise versioning layer (lakeFS).
Where you'd use DreamDB
What the model unlocks — tagged by honest maturity (what's proven vs. where it's heading).
Robotics & embodied-AI memory
Sensor streams — CMAF video, lidar, poses, embeddings — land on one timeline. Query "what did the robot see at time T?", replay an episode, or retrieve similar moments across runs. DreamDB's bullseye.
foundation readyServerless multimodal search / RAG
Semantic + hybrid search over images, video, and text with no backend — the browser runs ANN directly against object storage. Ship a search app over millions of items with just a bucket. (This demo is it.)
running in this demoForkable AI data layers
Keep one base media track; add CLIP, caption, SPLADE, or detection layers over it — branched and merged like code, without re-uploading the originals. Many teams enrich the same asset in parallel.
foundation readyVersioned, reproducible datasets
Snapshot, branch, and time-travel a training set; re-encode to a new model's embeddings while old versions stay queryable. Reproduce exactly which data + which embedding version trained a model.
foundation readyAgent / long-term memory
Every interaction time-anchored and embedded — a durable, cross-modal "external brain" an agent retrieves by time or similarity. The model is real today; low-latency at archive scale is the open work.
roadmapPrivate, on-device retrieval
Search runs client-side; the store only ever holds content-addressed objects, so queries never leave the device. Client-side retrieval works today; an at-rest encryption layer is on the roadmap.
roadmapIf HTTP moved information and Git made code collaborative, the bet behind DreamDB is to make multimodal signals organizable + addressable the same way — versioned, time-aligned, infinitely-layerable signal layers instead of dead files. The foundation above is real today; the global, multi-tenant, encrypted, settle-per-query signal network is the north star (it needs federation, multi-tenancy, and an encryption layer — not yet built).