3 个版本 (破坏性)

0.3.0 2024年1月19日
0.2.0 2024年1月11日
0.1.0 2021年8月29日

574数据库接口

Download history 56/week @ 2024-04-01 15/week @ 2024-05-20 4/week @ 2024-05-27 29/week @ 2024-06-03 7/week @ 2024-06-10 18/week @ 2024-06-17 6/week @ 2024-06-24

每月下载 60
3 个 Crates 中使用 (直接使用 2 个)

MIT/Apache

11KB
185

Loam

这是一个用于在文件中存储和查询树形数据结构的 Rust 库。其动机项目是 rosewood,它使用 R-Tree 存储地理空间数据。

Loam 允许您存储任何实现 Serialize 的内容。数据追加到文件末尾,一旦写入就不再修改。这使您可以使用 mmap 读取文件,而不会出现未定义的行为风险。

写入示例

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut writer = loam::Writer::new("../target/test.loam")?;
    let id = writer.push(&"Don't forget me!")?;
    writer.checkpoint(id)?;
    Ok(())
}

读取示例

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let reader = loam::Reader::new("../target/test.loam")?;
    let id = reader.root()?;
    let msg: String = reader.lookup(id)?;
    dbg!(msg);
    Ok(())
}

文件格式

一个 loam 文件以一个 Header 开头,后面跟着一系列 Chunks

Header

标题是固定长度的 ASCII 文本(8 字节)。

字段 字节
Magic loam 4
主版本号 数字:00 2
副版本号 数字:00 2

Chunks

一个 chunk 由这些字段组成,使用 bincode 序列化

字段 描述
长度 数据中的字节数量(可变长整数)
数据 序列化的 chunk 数据
Checksum† 长度 + 数据的 CRC-32(固定大小整数)

一个 Id 是 chunk 的文件偏移量。它可以用来从 Data 字段 Deserialize 数据。

† 如果启用了 crc 功能,则包含校验和。

Checkpoint

一个 checkpoint 是一个特殊的 chunk,它包含一个固定大小的 u64Id。文件必须始终以一个 checkpoint 结尾,以便读者可以查找根而无需扫描整个文件。

依赖项

~0.7–1.4MB
~32K SLoC