#vec #data #disk

bin+lib storable_vec

A very small, fast, efficient and simple storable Vec

4 releases

new 0.1.3 Feb 19, 2025
0.1.2 Jan 15, 2025
0.1.1 Jan 15, 2025
0.1.0 Jan 15, 2025

#899 in Database interfaces

Download history 144/week @ 2025-01-09 192/week @ 2025-01-16 3/week @ 2025-01-30 3/week @ 2025-02-06

342 downloads per month
Used in 4 crates

MIT license

33KB
855 lines

storable_vec

A very small, fast, efficient and simple storable vec which uses mmap2 for speed.

Features

  • Get (Rayon compatible)
  • Push
  • Update
  • Insert
  • Remove

Example

use std::path::Path;

use storable_vec::{AnyStorableVec, StorableVec};

fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;

    {
        let mut vec: StorableVec<usize, u32> = StorableVec::import(Path::new("./v"))?;
        vec.push(21);
        dbg!(vec.get(0)?); // 21
        vec.flush()?;
    }

    {
        let vec: StorableVec<usize, u32> = StorableVec::import(Path::new("./v"))?;
        dbg!(vec.get(0)?); // 21
    }

    Ok(())
}

Disclaimer

Portability will depend on the type of values.

Non bytes/slices types (u8, u16, ...) will be read as slice in an unsafe manner (using std::slice::from_raw_parts) and thus have the endianness of the system. On the other hand, &[u8] should be inserted as is.

If portability is important to you, just create a wrapper struct which has custom get, push, ... methods and does something like:

impl StorableVecU64 {
    pub fn push(&mut self, value: u64) {
        self.push(&value.to_be_bytes())
    }
}

Dependencies

~2.3–3MB
~57K SLoC