pub struct SpilledHashAgg<K, S>{
pub total_spilled_bytes: u64,
pub spill_count: u64,
/* private fields */
}Expand description
Hash aggregation table with optional spill-to-disk overflow.
Owns the in-memory HashMap<K, S> plus a list of PathBufs
pointing at spilled batch files. The caller drives the
lifecycle by calling accumulate for each input row and
drain once the input is exhausted.
Fields§
§total_spilled_bytes: u64Total bytes spilled across all batches — diagnostic.
spill_count: u64Number of times spill_partition was called — diagnostic.
Implementations§
Source§impl<K, S> SpilledHashAgg<K, S>
impl<K, S> SpilledHashAgg<K, S>
Sourcepub fn new(
spill_dir: impl AsRef<Path>,
mem_limit_bytes: usize,
avg_entry_bytes: usize,
) -> SpilledHashAgg<K, S>
pub fn new( spill_dir: impl AsRef<Path>, mem_limit_bytes: usize, avg_entry_bytes: usize, ) -> SpilledHashAgg<K, S>
Create a new spillable hash aggregator. spill_dir must
exist and be writable; the helper does NOT create it.
mem_limit_bytes == 0 disables spilling entirely (useful
for tests that want to exercise the in-memory path).
Sourcepub fn accumulate(&mut self, key: K, increment: S) -> Result<(), SpillError>
pub fn accumulate(&mut self, key: K, increment: S) -> Result<(), SpillError>
Insert or update an aggregation state for the given key.
accumulate triggers a spill when the in-memory table’s
estimated footprint exceeds the configured limit. Returns
the key/state pair after the merge so callers can chain.
Sourcepub fn spill_partition(&mut self) -> Result<(), SpillError>
pub fn spill_partition(&mut self) -> Result<(), SpillError>
Write the entire in-memory table to a new spill batch file
and clear the table. Updates the spill diagnostics. Caller
is free to keep accumulating after this returns — the
batch will be merged back during drain.
Sourcepub fn drain(self) -> Result<HashMap<K, S>, SpillError>
pub fn drain(self) -> Result<HashMap<K, S>, SpillError>
Consume the aggregator and return the final merged state for every group. Reads every spilled batch back into a new in-memory hash table, merges with whatever the accumulator left in place, and yields the unified set.
Memory profile: at peak, this holds ONE spill batch plus
the running merge table in memory simultaneously. If a
single spill batch is larger than mem_limit_bytes, we
return BatchTooLarge so the caller can switch strategies.
Sourcepub fn spilled_batch_count(&self) -> usize
pub fn spilled_batch_count(&self) -> usize
Number of spill batches currently on disk. Diagnostic hook for tests / metrics.
Sourcepub fn in_memory_groups(&self) -> usize
pub fn in_memory_groups(&self) -> usize
Number of groups currently held in memory.
Trait Implementations§
Source§impl<K, S> Drop for SpilledHashAgg<K, S>
impl<K, S> Drop for SpilledHashAgg<K, S>
Auto Trait Implementations§
impl<K, S> Freeze for SpilledHashAgg<K, S>
impl<K, S> RefUnwindSafe for SpilledHashAgg<K, S>where
K: RefUnwindSafe,
S: RefUnwindSafe,
impl<K, S> Send for SpilledHashAgg<K, S>
impl<K, S> Sync for SpilledHashAgg<K, S>
impl<K, S> Unpin for SpilledHashAgg<K, S>
impl<K, S> UnsafeUnpin for SpilledHashAgg<K, S>
impl<K, S> UnwindSafe for SpilledHashAgg<K, S>where
K: UnwindSafe,
S: UnwindSafe,
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request