Crate brk_vec

Source
Expand description

§BRK Vec

GitHub Repo stars License Version Documentation Size Dependency status Discord Nostr Bluesky X

A Vec (an array) that is stored on disk and thus which can be much larger than the available RAM.

Compared to a key/value store, the data stored is raw byte interpretation of the Vec’s values without any overhead which is very efficient. Additionally it uses close to no RAM when caching isn’t active and up to 100 MB when it is.

Compression is also available and built on top zstd to save even more space (from 0 to 75%). The tradeoff being slower reading speeds, especially random reading speeds. This is due to the data being stored in compressed pages of 16 KB, which means that if you to read even one value in that page you have to uncompress the whole page.

§Example

use std::{fs, path::Path};

use brk_core::Version;
use brk_vec::{AnyVec, CollectableVec, Format, GenericStoredVec, StoredVec, VecIterator};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let _ = fs::remove_dir_all("./vec");

    let version = Version::ZERO;
    let format = Format::Compressed;

    {
        let mut vec: StoredVec<usize, u32> =
            StoredVec::forced_import(Path::new("."), "vec", version, format)?;

        (0..21_u32).for_each(|v| {
            vec.push(v);
        });

        let mut iter = vec.into_iter();
        dbg!(iter.get(0));
        dbg!(iter.get(20));
        dbg!(iter.get(21));

        vec.flush()?;
    }

    {
        let mut vec: StoredVec<usize, u32> =
            StoredVec::forced_import(Path::new("."), "vec", version, format)?;
        let mut iter = vec.into_iter();

        dbg!(iter.get(0));
        dbg!(iter.get(0));
        dbg!(iter.get(1));
        dbg!(iter.get(2));
        dbg!(iter.get(20));
        dbg!(iter.get(20));
        dbg!(iter.get(0));

        vec.push(21);
        vec.push(22);

        let mut iter = vec.into_iter();

        dbg!(iter.get(20));
        dbg!(iter.get(21));
        dbg!(iter.get(22));
        dbg!(iter.get(23));

        vec.flush()?;
    }

    {
        let mut vec: StoredVec<usize, u32> =
            StoredVec::forced_import(Path::new("."), "vec", version, format)?;
        let mut iter = vec.into_iter();

        dbg!(iter.get(0));
        dbg!(iter.get(20));
        dbg!(iter.get(21));
        dbg!(iter.get(22));

        vec.truncate_if_needed(14)?;

        let mut iter = vec.into_iter();

        iter.get(0);
        iter.get(5);
        dbg!(iter.get(20));

        dbg!(vec.collect_signed_range(Some(-5), None)?);

        vec.push(vec.len() as u32);
        dbg!(VecIterator::last(vec.into_iter()));

        dbg!(vec.into_iter().collect::<Vec<_>>());
    }

    Ok(())
}

Structs§

CompressedPageMetadata
CompressedPagesMetadata
CompressedVec
CompressedVecIterator
EagerVec
IndexedVec
LazyVecFrom1
LazyVecFrom2
LazyVecFrom3
LazyVecFrom1Iterator
LazyVecFrom2Iterator
LazyVecFrom3Iterator
Length
Mmap
A handle to an immutable memory mapped buffer.
RawVec
RawVecIterator
UnsafeSlice

Enums§

Computation
ComputedVec
ComputedVecIterator
Dependencies
Format
StoredVec
StoredVecIterator

Constants§

MAX_CACHE_SIZE
MAX_PAGE_SIZE

Traits§

AnyCollectableVec
AnyIndexedVec
AnyIterableVec
AnyVec
BaseVecIterator
CloneableAnyIterableVec
CollectableVec
GenericStoredVec
StoredIndex
StoredType
VecIterator

Type Aliases§

BoxedAnyIterableVec
BoxedVecIterator
ComputeFrom1
ComputeFrom2
ComputeFrom3
ComputedVecFrom1
ComputedVecFrom2
ComputedVecFrom3