Prolly:基于 Prolly 树构建的内容寻址有序映射
Prolly 发布了 Prolly Rust 库 crate。用户依赖该包作为 prolly-map,而代码导入则保持简洁:使用 prolly::{Config, Prolly};。该 crate 提供内容寻址的 Prolly 树存储原语:在字节键和字节值上的不可变有序键值索引,具有稳定的内容派生结构,以实现高效的结构共享、差异、合并和批量加载。在 API 边界,Tree 是一个小的持久句柄:root: Option<Cid> 指向内容地址的根节点。config: Config 记录树使用的分块和编码参数。实际节点存储在可插拔的 Store 中。操作只克隆和重写受影响的路径或子树,写入新的内容地址节点,并返回一个新的 Tree 句柄。所有存储后备树工作只由一个与运行时无关的、异步优先的引擎实现。AsyncProlly<S: AsyncStore> 直接使用它;Prolly<S: Store> 通过内联只读适配器推动相同的完整操作。同步路径不会创建运行时、暂停线程或将存储调用调度到 Tokio。架构同一图表也以 diagram/prolly-tree-architecture@2x.png 的形式呈现,以便于喜欢光栅图像的上下文。完整的终端用户文档集位于 docs/,其中包括入门材料、指南、食谱、架构、设计规格、实现说明、路线图和语言移植指导。权威食谱为 docs/cookbook.md。原生近似最近邻索引在 docs/proximity-map.md 中进行了记录。重大更改和发布资格记录在 CHANGELOG.md 中。互动可视化工具浏览器应用程序位于 3rd/prolly-tree-visualizer,对该存储库的真实 @crabbuild/prolly-wasm 绑定执行变更,并渲染结果内容寻址树、查找路径、结构差异和存储历史。对于希望在 Prolly 树之上构建 Git 类似仓库层的应用构建者,请参见提议的 prolly-vcs 设计。它将 prolly-map 的重点保持在不可变的有序映射上,同时概述了一个具有通用后端中立 KvStore 基材的单独 crate,用于提交、引用、引用日志、补丁、合并协调、同步计划和仓库级 GC。此 crate 给予您的:按字母顺序排列的有序字节键查找;不可变更新:put、delete 和 batch 返回一个新的 Tree;内容寻址节点:每个节点 CID 是确定性节点字节的 SHA-256 哈希;使用 xxHash64 边界检查的确定性内容定义分块;由于未更改的节点保持相同 CID,版本之间的结构共享;通过修剪相等的 CID 和不相交的子跨度,提供高效的差异和范围差异;支持冲突解决器的三路合并;CRDT 风格的不冲突合并策略;懒惰范围迭代和基于光标的遍历;批量变更路径,适用于排序、分组、追加重和多叶写入;面向大初始树的并行批量构建器;通过 Store trait 进行可插拔存储,带有内存、SQLite 和可选的 RocksDB 实现;Merkle 风格的缺失节点计划和存储同步的复制助手;用于分支、标签、检查点和自定义根的快照命名空间助手;带有自动头、不可变内容派生版本、固定读取、证明、比较和合并、备份/同步、类型化编解码、订阅、多映射事务、有界历史和范围 GC 的事务安全 VersionedMap 外观;严格的 IndexedMap 协调器,用于运行时定义的非唯一二级索引,具有单根原子发布、有限操作预算、稀疏和多值术语、KeysOnly/Include/All 投影、精确历史快照、耐久的固定、安全的 GC、结构化诊断和验证的有界传输。应用程序通过相同的 engine.indexed_map(...) 形状在 Prolly 或 AsyncProlly 上访问它;这两条路径使用相同的标准状态格式和严格的事务根发布。原生异步支持是 PostgreSQL、MySQL、Redis、Turso、DynamoDB、Cosmos DB 和 Spanner 的一流特性,在阻塞应用程序需要时提供同步外观。对于树根,Store 独立的单键、共享多键、完整范围、光标页面和差异页面证明。树统计信息用于检查形状、填充因子、扇出和序列化大小。一个硬切的确定性邻近图,具有精确查找、过滤最佳优先搜索、本地化标准 COW、溢出/外部向量、SQ8/PQ/HNSW 加速、异步/SIMD 执行、类型化复制/GC 和描述符绑定证明。快速入门使用 prolly::{Config, MemStore, Prolly}; let store = MemStore::new(); let prolly = Prolly::new(store, Config::default()); let tree = prolly.create(); let tree = prolly.put(&tree, b"name".to_vec(), b"Alice".to_vec()).unwrap(); let value = prolly.get(&tree, b"name").unwrap(); assert_eq!(value, Some(b"Alice".to_vec())); let tree = prolly.delete(
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡