3 releases (breaking)

Uses new Rust 2024

0.3.0 May 22, 2025
0.2.0 May 18, 2025
0.1.0 May 16, 2025

#429 in Science

Unlicense

67KB
1.5K SLoC

compactor

A Compactor is like a Vec, but it automatically reduces the resolution of the data as it gets older.

You specify a compaction policy, like this:

let mut compactor = Compactor::<MyData>::new()
    .keep_for_days(7, Resolution::FiveMinute)
    .keep_for_days(30, Resolution::Hour)
    .keep_for_days(100, Resolution::Day)
    .build()?;

and how to compact your data, like this:

impl Aggregate for MyData {
    fn merge(&mut self, other: MyData) {
        *self = (*self + other) / 2;
    }
}

and then you can start pushing data into the compactor. Initially, data will be stored at "five-minute" resolution, meaning that pushed values will be merged into the previous value if they belong to the same five-minute bucket. After 7 days, the data will be compacted further, down to "one-hour" resolution. This means that any values within the same one-hour bucket (up to 12 values) will be merged into a single value. Data older than 30 days will be compacted again, and finally data older than 100 days will be deleted.

Licence

This software is in the public domain. See UNLICENSE for details.

Dependencies

~4.5MB
~71K SLoC