3 个版本 (破坏性)
0.3.0 | 2024年1月19日 |
---|---|
0.2.0 | 2024年1月11日 |
0.1.0 | 2021年8月29日 |
574 在 数据库接口 中
每月下载 60 次
在 3 个 Crates 中使用 (直接使用 2 个)
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,它包含一个固定大小的 u64
根 Id。文件必须始终以一个 checkpoint 结尾,以便读者可以查找根而无需扫描整个文件。
依赖项
~0.7–1.4MB
~32K SLoC