13 个版本 (7 个破坏性版本)

0.8.0 2024年7月11日
0.7.0 2024年3月25日
0.6.0 2024年2月19日
0.5.1 2023年11月19日
0.1.1 2018年12月22日

#263数据结构

Download history 39/week @ 2024-04-27 53/week @ 2024-05-04 68/week @ 2024-05-11 80/week @ 2024-05-18 17/week @ 2024-05-25 19/week @ 2024-06-01 22/week @ 2024-06-08 32/week @ 2024-06-15 15/week @ 2024-06-22 117/week @ 2024-06-29 136/week @ 2024-07-06 47/week @ 2024-07-13 55/week @ 2024-07-20 154/week @ 2024-07-27 28/week @ 2024-08-03 77/week @ 2024-08-10

每月321 次下载
2 个crate中使用 (通过 exocore-chain)

Apache-2.0

69KB
1.5K SLoC

extindex

crates.io

不可变持久化索引(在磁盘上),可以使用排序迭代器一次性构建,或者可以使用 extsort 对迭代器进行外部排序,然后从中构建索引。

索引允许随机查找和排序扫描。索引条目由键和值组成。键需要实现 EqOrd,并且键和值都需要实现一个 Serializable 特性以进行序列化和反序列化到磁盘。可以使用 serde 库为大多数类型实现此特性。

索引使用类似于跳表的数据结构构建,但查找从索引的末尾开始,而不是从开头。这允许在排序迭代器上单次遍历构建索引,因为从开头开始需要知道文件中的检查点/节点。

示例

extern crate extindex;
extern crate serde;

use extindex::{Builder, Entry, Reader, SerdeWrapper};

#[derive(Ord, PartialOrd, Eq, PartialEq, Debug, serde::Serialize, serde::Deserialize)]
struct SomeStruct {
    a: u32,
    b: String,
}

fn main() {
    let index_file = tempfile::NamedTempFile::new().unwrap();

    let builder = Builder::new(index_file.path());
    let entries = vec![Entry::new(
        "my_key".to_string(),
        SerdeWrapper(SomeStruct {
            a: 123,
            b: "my value".to_string(),
        }),
    )];
    builder.build(entries.into_iter()).unwrap();

    let reader = Reader::<String, SerdeWrapper<SomeStruct>>::open(index_file).unwrap();
    assert!(reader.find(&"my_key".to_string()).unwrap().is_some());
    assert!(reader.find(&"notfound".to_string()).unwrap().is_none());
}

路线图

  • 可以使用Bloom过滤器在索引不包含键时避免磁盘访问。

依赖关系

~3–13MB
~173K SLoC