dbm是key-value store较常见的一种存储实现。http://en.wikipedia.org/wiki/Dbm dbm的各个实现。
http://aurora.regenstrief.org/~schadow/dbm-java/上有3个纯java的dbm实现。其中一个是W3C's
Jigsaw项目中抽离出来,后面出现的w3c-dbm都是指该项目。w3c-dbm实现比较简单,不支持事务。也不保证数据的完整和可靠。
w3c-dbm是一个hash表。先说几个概念:
1.block:w3c-dbm 把磁盘划分一系列block进行管理。block的大小在初始化时确定,并写入文件头保存,不能更改。
2.dir(目录),每个dir指向一个bucket。bucket是一个元素列表。可能有多个dir指向同一个bucket.dir_size,dir的数目,dir_bits,dir_size = 2^dir_bits。
3.bucket_ele,bucket保存的元素,里面有5个属性:hashval,key的hash值;keystart,key开始的4个字节,用于在bucket里快速判断该key是否要查找的key;keysize;datasize;fileptr:bucket_ele里不直接包含key和value,fileptr是文件的偏移量,指向真正的key和value的位置。每个bucket的bucket_ele必须保存在同一个block里,所以bucket_ele数目上限由block大小决定。在block中处理hash冲突时采用开发地址法。
4.bucket_bits,记录bucket的分裂次数,初始化为0,分裂后的bucket在分裂前的值加1.
bucket_bits==dir_bits,dir不够用,需要double dir数目。
5.hash_value,key的hash值,32bit,其中只用上31bit,最高bit为0.在定位key时,先计算key的hash_value,右移31-dir_bits位,得到的值就是hash_value的高dir_bits+1 bit,其中最高bit是0.dir_size有dir_bits位,用该值做dir的下标来定位dir。
下面描述一下w3c-dbm如何管理hash表,重点是bucket分裂和dir double。
1.初始化时,dir_size为n,n=2^dir_bits,n个dir指向同一个bucket。所有的元素实际上都是在同一
bucket里。该bucket的bucket_bits=0.当bucket满时,分裂成2个,[0,n/2)的dir指向分裂后的bucket0,[n/2,n)的dir指向分裂后的bucket1。原先的bucket_ele重新分配一次,在dir的入口不变,但是dir指向的bucket变了。引入一个dir_area的概念,一个dir_area里的dir指向相同的bucket,分裂时变成2个,每个的范围只有之前的一半。一个理想状态的饱满的dir是每个dir_area范围只有1,均指向不同的bucket。
2.bucket分裂后bucket_bits 加1.例如dir_size=4的dir,dir_bits=2,第一次分裂成dir_area0:[0.2),dir_area1:[2,4).dir_area0再分裂dir_area0_0:[0,1),dir_area0_1:[1,2).这时的dir_area0_0和dir_area0_1指向的bucket_bits为2,等于dir_bits,表明不能再进行分裂了。如果需要再分裂这两个area,必须要增加dir的数量。
3.增加dir数量很简单,直接double,伪代码
new_dir[] = new dir[dir_size*2];
for(int i=0;i<dir_len;i++){
new_dir[i] = dir[i];
new_dir[i+1] = dir[i];
}
dir = new_dir;
dir_bits+=1;
double之后,原来的映射仍然生效。
double前old_bucket_idx = dir_bits bit.double后,new_bucket_idx = old_bucket_idx*2+(0/1), dir_bits+1 bit.
其他一些细节比较简单:
1,对于block里的空闲空间管理。
2,在bucket里元素的插入不是直接放在列表的头或尾,会有一个二次映射。删除时也会对bucket的bucket_ele做整理。这些都是内存操作,不涉及到io。
分享到:
相关推荐
峰峰值电压是指信号的最大值与最小值之差。对于正弦波而言,其峰峰值电压 \( V_{pp} \) 和均方根值电压 \( V_{rms} \) 之间的关系可以通过以下公式来表示: \[ V_{pp} = V_{rms} \times \sqrt{8} \] \[ V_{rms} = \...
标题“dBm - volts - watts conversion.pdf”和描述说明了本PDF文件提供的是dBm(分贝毫瓦)与电压(volts)和功率(watts)之间的转换表。dBm是一个常用的对数单位,用于表示功率相对于1毫瓦的分贝数。这个单位在...
- 32dBm = 30dBm + 3dBm + 3dBm + 3dBm + 3dBm - 10dBm - = 1W × 2 × 2 × 2 × 2 × 0.1 - = 1.6W #### 四、+1dBm和+2dBm的计算技巧 对于+1dBm和+2dBm的情况,可以通过以下技巧来简化计算: - **+1dBm的...
在EMC测试和分析中,经常需要进行功率和电压单位之间的转换,例如dBm、dBW、W、dBuV、dBV以及V等。这些单位在不同场景下各有其优势,理解并熟练掌握它们的换算关系对于工程师来说至关重要。 首先,我们来看功率单位...
### dBm与dBv转换表知识点详解 #### 一、基础知识概述 在射频与视频技术领域中,信号强度的度量单位多种多样,其中最常用的包括dBm和dBv。这两种单位分别代表不同的参考基准,因此在实际应用中经常需要进行相互...
标题中的“dBm-Vpp Conversion”指的是将功率电平单位dBm转换为峰峰值电压单位Vpp的换算过程。dBm是一个表示功率相对于1毫瓦的对数单位,常用于无线通信和电子工程中描述功率水平。而Vpp(Volts peak-to-peak)表示...
通过查表,迅速得出dBm-volts-watts的换算关系。免去复杂的计算。
在电子工程领域,不同的功率单位之间进行转换是常见的需求之一。本文将详细介绍如何在dBm、伏特(volts)和瓦特(watts)这三个单位之间进行转换,这对于理解信号强度、电源管理和电路设计等方面至关重要。 #### ...
在PyPI官网上,我们可以找到各种各样的Python库,其中之一就是“dbm-agent-0.10.0.tar.gz”。这个资源全名为“dbm-agent-0.10.0”,其格式为tar.gz,这是一种常见的用于打包和压缩文件的格式,通常包含源代码和其他...
DBM,全称为Database Manager,是一款专为ClickHouse设计的可视化管理工具,帮助用户更方便地管理和操作ClickHouse数据库。DBM 1.4.0 Mac版是针对苹果Mac OS操作系统优化的版本,提供友好的图形用户界面,使得在Mac...
44dBm=30dBm+10dBm+10dBm-3dBm-3dBm =1W×10 ×10 ×1/2 ×1/2 =25W 例2:32dBm=?W 32dBm=30dBm+3dBm+3dBm+3dBm-10dBm =1W×2×2×2×0.1 =1.6W 五、计算技巧 在计算中,需要记忆以下计算技巧: * +1dBm=X×...
The clusters of Eu^(3+) ion in Eu(DBM)3Phen-doped polymethyl methacrylate (PMMA) have been studied by three means. The relative fluorescence intensity ratio of the 5D0 -> 7F2 to 5D0 -> 7F1 ...
+ +2dBm= - 10dBm+3dBm+3dBm+3dBm+3dBm = X×0.1 ×2×2×2× 2 = X×1.6 在计算中,有时候也可以根据上面的规律变换为-1dBm 和-2dBm,达到快速口算的目的。 dBw 与 W的换算 dBw 是一个表示功率绝对值的...
从上表中可以看出,随着dBm数值的增加,对应的功率和电压也随之增加。此外,对于相同的dBm值,不同的阻抗条件下,其对应的电压值也有所不同,但功率保持不变。 #### 结论 通过对dBm到W和V的换算过程及其对照表的...
这当中涉及到的单位包括伏特(V)、dBm、dBm/Hz等,它们各自代表着不同的物理量或测量维度。下面我们将详细讲解这些射频单位之间的转换公式及其在不同情境下的应用。 首先,我们来明确几个射频单位的基本含义和它们...
例如,要将44dBm转换为W,我们可以这样计算:44dBm=30dBm+10dBm+10dBm-3dBm-3dBm,这相当于1W的10倍的10倍再除以2的平方,因此44dBm等于25W。 对于+1dBm和+2dBm的计算,可以简化为+1dBm=X×1.25,+2dBm=X×1.6。...
同样,32dBm = 30dBm + 3dBm + 3dBm + 3dBm + 3dBm - 10dBm = 1.6W。 此外,对于+1dBm 和+2dBm 的计算,可以通过调整原则来简化。+1dBm 等于 X * 1.25,而+2dBm 等于 X * 1.6。同样,可以使用类似的方法处理 -1dBm ...
dbm和mw对应表-可快速得到相互转换的值