3 个版本
0.1.16-alpha.0 | 2023年4月1日 |
---|---|
0.1.12-alpha.0 | 2023年1月19日 |
0.1.10-alpha.0 | 2023年1月18日 |
#10 在 #data-block
521 每月下载量
在 66 个crate中使用(通过bitcoin-leveldb)
795KB
2K SLoC
bitcoinleveldb-duplex Rust Crate 描述
duplex
duplex
模块包含了双层迭代器的实现。用于遍历存储在LevelDB中的有序键值映射。
BlockFunction
BlockFunction
是一个trait,定义了用于压缩键值对块的功能接口。
TwoLevelIterator
TwoLevelIterator
是一个struct,它提供了在LevelDB中存储的有序键值映射上的双层迭代器的实现。
init_data_block
init_data_block
函数用于初始化一个新的数据块。
key
key
方法用于返回迭代器的当前键。
next
next
方法用于将迭代器推进到下一个键值对。
prev
prev
方法用于将迭代器移动到上一个键值对。
save_error
save_error
函数用于在迭代器的状态中保存错误消息。
seek
seek
方法用于将迭代器移动到指定的键。
seek_to_first
seek_to_first
方法用于将迭代器移动到第一个键值对。
seek_to_last
seek_to_last
方法用于将迭代器移动到最后一个键值对。
set_data_iterator
set_data_iterator
方法用于设置数据迭代器。
skip_empty_data_blocks_backward
skip_empty_data_blocks_backward
方法用于在向后移动迭代器时跳过空数据块。
skip_empty_data_blocks_forward
skip_empty_data_blocks_forward
方法用于在向前移动迭代器时跳过空数据块。
status
status
方法用于返回迭代器的当前状态。
valid
valid
方法用于检查迭代器是否有效。
value
《value》方法用于返回迭代器的当前值。
注意:这个crate是比特币核心从C++直接翻译到Rust的一部分。因此,一些函数体可能仍在翻译过程中。需要注意的是,一旦翻译完成,这个系统将成为可测试的。
14>在leveldb的上下文中,什么是两级迭代器?
在LevelDB中,两级迭代器是一个使用两级迭代来允许高效遍历数据库中键值对的迭代器。
第一级迭代是一个块迭代器,它遍历存储在SST文件(排序字符串表文件)中的键值对块。第二级迭代是一个数据块迭代器,它遍历给定块内的键值对。
通过使用两级迭代器,LevelDB可以避免一次性将整个SST文件读入内存的需求。相反,它将需要的键值对块读入内存,并使用数据块迭代器遍历它们。
在《bitcoinleveldb-duplex》crate中,BlockFunction令牌是两级迭代器用于从数据库中加载下一个键值对块的回调函数。《init_data_block》、《skip_empty_data_blocks_backward》、《skip_empty_data_blocks_forward》、《set_data_iterator》和《save_error》令牌都是两级迭代器用来操纵数据块迭代器和在键值对块之间导航的方法。《status》、《valid》、《key》、《value》、《next》、《prev》、《seek》、《seek_to_first》和《seek_to_last》令牌是用来遍历块内键值对的方法。
15> 谢谢——使用时我们应该知道哪些事情?
以下是使用LevelDB中的两级迭代器时需要考虑的一些事项
-
当需要迭代大量数据且数据无法全部放入内存时,两级迭代器非常有用。它们允许你在迭代过程中将数据保持在磁盘上,并按需读取。
-
两级迭代器由一个顶层迭代器组成,它按排序顺序迭代键,以及一个底层迭代器,它迭代与每个键关联的值。
-
顶层迭代器使用LevelDB内部迭代器实现,而底层迭代器使用基于块的迭代器实现。
-
创建两级迭代器时,必须指定一个块大小。这决定了在迭代过程中从磁盘读取的数据块的最大大小。较小的块大小会导致更多的I/O,但在内存有限的情况下可能是必要的。
-
由于需要从磁盘读取数据所需的I/O,两级迭代器通常比内存迭代器慢。如果你可以将数据放入内存,你应该使用内存迭代器。
-
可以通过指定要迭代的键的范围来使用两级迭代器迭代数据子集。
-
在迭代大量数据时,跟踪进度并优雅地处理错误非常重要。你可能想要定期报告进度或使用进度条让用户知道已经完成了多少工作。
-
如果你需要在迭代数据库的同时修改数据库,你应该使用快照以确保正在迭代的 数据保持一致。
-
两级迭代器通常是线程安全的,但你仍应确保你不会从多个线程同时修改迭代器或底层数据库。
-
最后,当使用双层迭代器时,彻底测试您的代码非常重要。由于它们涉及更多的I/O操作,并且比内存迭代器有更多的潜在故障点,您可能会遇到意外的行为或性能问题。
依赖关系
~89MB
~834K SLoC