6 个版本

0.2.0 2023年10月22日
0.1.4 2023年10月12日
0.1.3 2023年9月15日

Unix API 中排名 335

Download history 26/week @ 2024-03-28 14/week @ 2024-04-04

每月下载量 64

MIT 许可证

37KB
706 代码行数(不包括注释)

Rust 内存映射向量

CI Status codecov docs.rs Crates.io LICENSE

此包包含创建内存映射数据结构的实现/辅助工具。

有时,你需要处理无法装入内存的向量/数据。将它们移到磁盘并映射到内存是处理此问题的良好方法。

如何使用它?

非常简单!

use mmap_vec::MmapVec;

#[derive(Debug, PartialEq, Clone, Copy)]
struct Row {
    id: usize,
    age: u8,
}

let row1 = Row { id: 42, age: 18 };
let row2 = Row { id: 894, age: 99 };

// Create a memory mapped vec 😎
let mut v = MmapVec::<Row>::new();

// Push can trigger new mmap segment creation, so it can fail.
v.push(row1).unwrap();
v.push(row2).unwrap();

// Check the content
assert_eq!(v[0], row1);
assert_eq!(&v[..], &[row1, row2]);

// Pop content
assert_eq!(v.pop(), Some(row2));
assert_eq!(v.pop(), Some(row1));

查看单元测试以获取更多示例。

它是如何工作的?

这里的主要思想是提供一个基本的 struct Segment

此结构提供了类型 T 的常量大小内存映射数组。通过将 Segment 包装在一个新的结构 MmapVec 中,该结构处理段的增长/缩小,从而解决问题。

段存储在磁盘上的位置在哪里?

目前数据存储在 .cache(如果使用 'cache-dirs' 功能)或 /tmp 下的专用文件夹中。

生成 UUID V4 以避免在创建段时发生冲突。

❯ ls /tmp/mmap-vec-rs -1
/tmp/mmap-vec-rs/00d977bf-b556-475e-8de5-d35e7baaa39d.seg
/tmp/mmap-vec-rs/6cb81228-9cf3-4918-a3ef-863907b32830.seg
/tmp/mmap-vec-rs/8a86eeaa-1fa8-4535-9e23-6c59e0c9c376.seg
/tmp/mmap-vec-rs/de62bde3-6524-4c4b-b514-24f6a44d6323.seg

段创建是否可配置?

是的!以 test_custom_segment_creator::test_custom_segment_builder 为例。

由于段创建是通过一个特性来管理的。你可以自由地按自己的方式配置它。

这个是否在 Windows 上工作?

不行。我没有针对这个操作系统,并希望尽可能保持这个包简单。

我还想尽可能减少依赖。

❯ cargo tree
mmap-vec v0.1.1
├── libc v0.2.147
├── uuid v1.4.1
|   └── getrandom v0.2.10
|       ├── cfg-if v1.0.0
|       └── libc v0.2.147
# Optional using 'cache-dir' feature
├── dirs v5.0.1
│   └── dirs-sys v0.4.1
│       ├── libc v0.2.147
│       └── option-ext v0.2.0
[dev-dependencies]
└── glob v0.3.1

这个包是否已准备好用于生产?

是的 😁!自 v0.1.1 以来。但现在功能有点有限...

欢迎通过 GitHub PR 帮助改进!

预取 API 目前尚不稳定,将来可能会更改。

想法/新功能?

  • 实现自定义 std::alloc::Allocator 以与 std::vec::Vec 一起使用

许可证:MIT

依赖项

~0.3–11MB
~68K SLoC