5 个版本 (3 个破坏性更新)
0.5.0 | 2023 年 8 月 8 日 |
---|---|
0.4.1 | 2023 年 8 月 8 日 |
0.4.0 | 2023 年 8 月 7 日 |
0.3.0 | 2023 年 8 月 5 日 |
0.2.0 | 2023 年 7 月 21 日 |
#844 在 数据结构
每月 22 次下载
45KB
1K SLoC
landfill
一组用于处理持久性、磁盘上数据的数据结构。
目标是拥有一个易于推理的持久化层,允许并发访问和修改,并在磁盘上存储的数据周围提供安全且强大的抽象。
垃圾填埋场的设计倾向于简单,并通过内存映射将所有缓存和页面处理留给内核。
通常,这里实现的结构只能 增长,如果需要任何形式的垃圾回收,它必须在上层实现。
该库有 4 个主要组件,每个组件对应于文件或一组文件。
熵
Entropy
组件是一个包含 4 个随机 u64 的 256 字节文件。
这用于校验和、创建nonce、提供区分不同存储的标签等。
日志
Journal
存储了多个增量更新,例如 AppendOnly
缓冲区的写头,并设计为线程安全和容错。
它通过保存值的多个版本及其相应的校验和来实现。
打开 Journal
时,将恢复具有有效校验和的最大值,从而防止损坏的半完成写入。
随机访问
类型为 T
的随机访问、自动增长的数组。
它使用有限数量的 RWLock,这些锁映射到索引位置。
读取操作获取读锁,并返回守卫,而写入操作只能在传递给 with_mut
函数的闭包中执行。这是为了避免在同时尝试持有多个可变引用时发生死锁的可能性。
请注意,存储的值为全部零的值将视为空空间,并在 get
上返回 None
。
追加只读
一个追加只读的字节虚拟文件,它保留有关已写入多少字节的内部日志,并且写入的数据在内存中 永远不会移动,因此可以安全地分配在结构本身存在的时间内引用的结构。
一旦映射
一个 K-V 映射,将键映射到值,值不能被删除或更新,因此可以在添加更多 kv 对时安全地保留对它们的引用。
内容
内容地址数据的存储库,写入此存储库的字节将被提供的通用加密哈希函数进行哈希处理,并返回一个ContentId
,该ID可以用来再次获取数据的引用。
在实现上类似于OnceMap
,但节省了空间,因为不需要存储键,而是在获取时重新计算,从而提供了一层额外的保护,防止损坏的读取。
依赖项
~1.5–7.5MB
~47K SLoC