Skip to main content

Matcher scale — pure-Node block → score → cluster (#K)

Generated by scripts/record-matcher/matcher-scale.ts. Synthetic geo-clustered records (~3 per distinct place), resolved with the geo-first baseline (collapsed spatial + EMexpectation-maximizationAn iterative algorithm that estimates model parameters when some variables are unobserved. In Mailwoman's matcher, EM learns the Fellegi-Sunter m and u parameters from unlabeled data — no training labels needed.) in ONE Node process — no Elasticsearch, no server. GeocodinggeocodingThe process of converting an address into geographic coordinates (latitude and longitude). Mailwoman geocodes in a multi-tier cascade: exact address-point match → street interpolation → locality centroid. Each tier is progressively coarser but more widely available. is out of scope (measured separately); this isolates the matcher's block/score/cluster cost vs N.

recordscandidate pairsentitieswall-clockresolve rateRSS (high-water)
10,00012,3213,3330.19 s52,038/s141 MB
50,000106,76616,6651.49 s33,641/s302 MB
100,000327,26033,3334.40 s22,726/s463 MB
250,0001,673,91583,33319.80 s12,626/s1085 MB
500,0006,191,571166,66768.53 s7,296/s2299 MB

Reading

The matcher resolves 500,000 records in 68.53 s in a single Node process — block → Fellegi-SunterFellegi-SunterA probabilistic record linkage model that computes match probability from agreement-level log-likelihood ratios: log₂(m/u) where m is the probability of agreement given a true match and u is the probability of agreement by chance. Mailwoman learns m and u label-free via expectation-maximization. → union-find clusteringclusteringThe final stage of entity resolution: resolve non-transitive pairwise match decisions (A↔B, B↔C, but not A↔C) into canonical entities via union-find with path compression. Each cluster of records becomes one resolved entity., no external service. Geo-cell + canonical-key blockingblockingThe first stage of entity resolution: generate candidate record pairs using cheap, high-recall keys (geo cell, canonical address, phone) instead of comparing every record to every other (O(n²)). The matcher only scores pairs that survive blocking. keeps candidate generation near-linear (it never enumerates the O(n²) pair space), so the wall-clock scales with the number of blocked pairs, not the square of N. That is the architectural claim made concrete: a calibrated streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-level geocoder feeding the blockingblockingThe first stage of entity resolution: generate candidate record pairs using cheap, high-recall keys (geo cell, canonical address, phone) instead of comparing every record to every other (O(n²)). The matcher only scores pairs that survive blocking. lets entity resolutionrecord matchingThe process of determining whether two database records refer to the same real-world entity. Mailwoman's matcher uses a geocode-first approach (match the resolved place, not the address string) with Fellegi-Sunter probabilistic scoring. run in-process at hundreds of thousands of records, where a string-similarity matcher would need a search cluster to make the candidate generation tractable.

RSS is the shared-process high-water mark across the sweep (each size reuses the heap), so it is an upper bound, not a per-N working set. The largest size that fits is bounded by the record objects + the link array; beyond that, shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. by geography (each cell is independent) — the same partition the blockingblockingThe first stage of entity resolution: generate candidate record pairs using cheap, high-recall keys (geo cell, canonical address, phone) instead of comparing every record to every other (O(n²)). The matcher only scores pairs that survive blocking. already implies.

One honest caveat on the shape: these are uniform-random US coordinates, so as N rises the geo-cell collision rate climbs and the candidate-pair count grows faster than N (visible in the table). Real address data clusters into a roughly fixed set of places, so its pair/record ratio is flatter — the wall-clock here, which tracks the number of PAIRS, is a conservative upper bound on a realistic workload of the same N.