#mmap #vec #memory-buffer #file #memmap2 #read-write

memvec

内存支持的向量,不是缓冲区。专为mmap设计。不是MemMap,而是MemVec!

5个版本

0.1.0 2022年8月22日
0.0.5 2022年6月18日
0.0.3 2022年5月5日

899数据结构

Download history 8/week @ 2024-03-10 18/week @ 2024-03-24 32/week @ 2024-03-31 29/week @ 2024-04-07 45/week @ 2024-04-14 85/week @ 2024-04-21 206/week @ 2024-04-28 63/week @ 2024-05-05 114/week @ 2024-05-12 78/week @ 2024-05-19 27/week @ 2024-06-02 11/week @ 2024-06-09 144/week @ 2024-06-16 12/week @ 2024-06-23

每月194次下载

BSD-2-Clause

42KB
932

MemVec

MemVec是连续内存缓冲区的Vec-like接口。主要用于与mmap一起使用。

VecFile是一个简单的线性数据库。对于数据库,一个文件是一系列记录的集合。VecFile是记录文件的Vec接口,不提供读取、写入和查找功能,但使用mmap。

VecFile + MemVec

use memvec::{MemVec, VecFile};

#[derive(Copy, Clone)]
#[repr(C, packed)]
struct Record {
    time: std::time::Instant,
    event_id: u32,
    _payload: [u8; 50], // we will not use it
}

fn main() {
    let mut path = std::env::temp_dir();
    path.push("vecfile.memvec");

    let vec_file = VecFile::open(&path).expect("file open failed");
    let mut vec =
        unsafe { MemVec::<Record, _>::try_from_memory(vec_file) }.expect("vec file is corrupted");

    if vec.len() == 0 {
        // creating a new file
        println!("creating a new file: {path:?}");
        for i in 0..10 {
            vec.push(Record {
                time: std::time::Instant::now(),
                event_id: '1' as u32 + (i % 3),
                _payload: unsafe { std::mem::zeroed() },
            })
        }
    } else {
        // found an existing file
        for (i, item) in vec.iter().enumerate() {
            println!(
                "idx: {i} time: {time:?} event_id: {event_id}",
                time = item.time,
                event_id = item.event_id
            );
        }
        vec.clear();
        println!("deleted existing file: {path:?}");
    }
}

依赖关系

~165KB