pub struct ShardedCountMinSketch { /* private fields */ }Expand description
A CountMinSketch split into SHARDS independently locked pieces on one
node-wide aging clock.
Every counter a given key touches lives in one shard, so an increment or an
estimate takes exactly one shard lock and reads or writes ROWS counters.
Halving is per shard and lazy: the shard is aged on its next touch by the
number of node-wide windows that have elapsed since it last caught up. So the
work is 1 / SHARDS of the array under one lock, while every counter is
caught up to the node-wide clock at the moment it is read. A ranking pass
reads each candidate separately, so it carries one halving of skew for every
window boundary it crosses. A halving applied evenly across a pass cannot
invert the ranking — it only creates ties — but candidates read on opposite
sides of a boundary can misorder, and two whose estimates are within a
factor of two can swap. The window is cols * 10 observations, so a sweep
crossing even one boundary is already the uncommon case, and the next sweep
re-reads both on one side of it.
The interior mutability is deliberate — the frequency estimator is shared by
every serve completion and every fill-path admission read, so both take
&self and neither can serialize on a single process-wide lock.
Implementations§
Source§impl ShardedCountMinSketch
impl ShardedCountMinSketch
Sourcepub fn new(cols: usize) -> Self
pub fn new(cols: usize) -> Self
Build a sketch of cols total columns per row, spread over SHARDS
shards. The per-shard width rounds up, so the realized total is at least
cols.
A cols below SHARDS yields one shard per column, which is a
degenerate sketch rather than a smaller one: at cols <= SHARDS every
shard is one column wide, so all ROWS rows of a shard index the same
counter and the min-over-rows stops discriminating between keys that
share a shard. Callers wanting a small sketch should floor cols well
above SHARDS, as super::tinylfu::TinyLfuEstimator::new does.
Sourcepub fn increment(&self, key: &Hash)
pub fn increment(&self, key: &Hash)
Count one sighting of key, locking only its shard.
A poisoned shard recovers its inner sketch: the counters are approximate popularity evidence, and refusing to count into a shard would silently freeze the frequency of every key routed to it.
Sourcepub fn estimate(&self, key: &Hash) -> u8
pub fn estimate(&self, key: &Hash) -> u8
The count-min estimate for key, locking only its shard. An absent shard
(only reachable from an empty sketch) reads as never seen.
Reading ages the shard too: a key in a shard that has seen no traffic for several windows must not read back at the value it held before those windows elapsed, or a cold key would outrank a warm one.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for ShardedCountMinSketch
impl RefUnwindSafe for ShardedCountMinSketch
impl Send for ShardedCountMinSketch
impl Sync for ShardedCountMinSketch
impl Unpin for ShardedCountMinSketch
impl UnsafeUnpin for ShardedCountMinSketch
impl UnwindSafe for ShardedCountMinSketch
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more