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。
分享到:
相关推荐
PL2音频处理器的输入电平要求为0±10dBm,输出电平为+10dBm,起限点最低输入电平为10dBm。压缩比设定为20:1 dB,谐波失真要求低于特定标准,例如在不同频率范围内优于0.25%到1.5%。信杂比需优于68dB,频率响应需在...
MiniSQL (mSQL) and W3-mSQL H DBI H ODBC Tools H Some Useful Hotlists H G Problem-Solving Debugging H Tuning Performance H G The Future of Web/Database Interfaces G From Here... G Chapter 13 ...
cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" ... ``` 这些VBScript命令用于设置IIS Web服务的ISAPI扩展配置,可能用于增加或修改允许的ISAPI过滤器,...
win7修复本地系统工具
《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt
《计算机专业英语》chapter12-Intelligent-Transportation.ppt
内容概要:本文详细介绍了基于西门子S7-1200博图平台的3轴伺服螺丝机程序。该程序使用SCL语言编写,结合KTP700组态和TIA V14及以上版本,实现了对X、Y、Z三个轴的精密控制。文章首先概述了程序的整体架构,强调了其在自动化控制领域的高参考价值。接着深入探讨了关键代码片段,如轴初始化、运动控制以及主程序的设计思路。此外,还展示了如何通过KTP700组态实现人机交互,并分享了一些实用的操作技巧和技术细节,如状态机设计、HMI交互、异常处理等。 适用人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC编程感兴趣的工程师。 使用场景及目标:适用于希望深入了解西门子S7-1200博图平台及其SCL语言编程特点的学习者;旨在帮助读者掌握3轴伺服系统的具体实现方法,提高实际项目中的编程能力。 其他说明:文中提供的代码示例和设计理念不仅有助于理解和学习,还能直接应用于类似的实际工程项目中。
内容概要:本文详细探讨了五种非线性滤波器(卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波(PF)和变维卡尔曼滤波(VDKF))在水下长基线定位(LBL)系统中的应用。通过对每种滤波器的具体实现进行MATLAB代码展示,分析了它们在不同条件下的优缺点。例如,KF适用于线性系统但在非线性环境中失效;EKF通过雅可比矩阵线性化处理非线性问题,但在剧烈机动时表现不佳;UKF利用sigma点处理非线性,精度较高但计算量大;PF采用蒙特卡罗方法,鲁棒性强但计算耗时;VDKF能够动态调整状态维度,适合信标数量变化的场景。 适合人群:从事水下机器人(AUV)导航研究的技术人员、研究生以及对非线性滤波感兴趣的科研工作者。 使用场景及目标:①理解各种非线性滤波器的工作原理及其在水下定位中的具体应用;②评估不同滤波器在特定条件下的性能,以便为实际项目选择合适的滤波器;③掌握MATLAB实现非线性滤波器的方法和技术。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现这些滤波器。此外,还讨论了数值稳定性问题和一些实用技巧,如Cholesky分解失败的处理方法。
VMware-workstation-full-14.1.3-9474260
DeepSeek系列-提示词工程和落地场景.pdf
javaSE阶段面试题
《综合布线施工技术》第5章-综合布线工程测试.ppt
安川机器人NX100使用说明书.pdf
内容概要:本文详细介绍了将M7120型平面磨床的传统继电器控制系统升级为基于西门子S7-1200 PLC的自动化控制系统的过程。主要内容涵盖IO分配、梯形图设计和组态画面实现。通过合理的IO分配,确保了系统的可靠性和可维护性;梯形图设计实现了主控制逻辑、砂轮升降控制和报警逻辑等功能;组态画面则提供了友好的人机交互界面,便于操作和监控。此次改造显著提高了设备的自动化水平、运行效率和可靠性,降低了维护成本。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和控制系统设计的专业人士。 使用场景及目标:适用于需要进行老旧设备升级改造的企业,旨在提高生产设备的自动化水平和可靠性,降低故障率和维护成本。具体应用场景包括但不限于金属加工行业中的平面磨床等设备的控制系统改造。 其他说明:文中还分享了一些实际调试中的经验和技巧,如急停逻辑的设计、信号抖动的处理方法等,有助于读者在类似项目中借鉴和应用。
chromedriver-linux64-136.0.7103.48.zip
IMG_20250421_180507.jpg
《网络营销策划实务》项目一-网络营销策划认知.ppt
Lianantech_Security-Vulnerabil_1744433229
MybatisCodeHelperNew2019.1-2023.1-3.4.1
【深度学习部署】基于Docker的BERT模型训练与API服务部署:实现代码复用与模型共享