#vec #disk #data

bin+lib storable_vec

A very small, fast, efficient and simple storable Vec

3 releases

new 0.1.2 Jan 15, 2025
0.1.1 Jan 15, 2025
0.1.0 Jan 15, 2025

#1078 in Database interfaces

Download history 223/week @ 2025-01-10

223 downloads per month

MIT license

10KB
220 lines

storable_vec

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

Features

  • Get (Rayon compatible)
  • Push
  • Update
  • 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

~3.5–9MB
~76K SLoC