本发明涉及一种基于外部存储实现高效查找哈希表的预处理方法,应用于所有使用哈希表进行数据存储、查找的领域。
背景技术:
传统哈希表最大的缺点是:它是基于数组的,数组被创建后难于扩展,程序必须要知道表中将要存储多少数据,如果缓存开辟得太小,则很容易被高冲突率数据填满,需要定期地把数据转移到更大的哈希表中,这是个费时的过程;如果缓存开辟得太大,远远大于最后实际存储的记录个数,则会浪费大量的内存空间,这是一个矛盾的存在。同时当过多的冲突发生在同一位置时,传统哈希表需要逐级访问这个位置的元素,直到找出符合需要的那个元素,所需要的时间非常长。
技术实现要素:
本发明为了解决上述问题,提出一种基于外部存储实现高效查找哈希表的预处理方法,为每一组哈希值相同的数据分配一块足够大的存储空间,存入外部存储器中,这样既不用担心缓存太小导致性能下降的问题,又不会浪费cpu的内存空间;而且本发明在访问同一位置的元素时,可以预先将该组哈希值相同的数据全部读取出来,同时在cpu中可以开辟一块缓存,将部分头部哈希表数据存在其中,这样查找时间就会大大缩短,解决了传统哈希表在处理高冲突率时效率不高的问题。
本发明采用的技术方案为:
一种基于外部存储实现高效查找哈希表的预处理方法,其特征在于:哈希表采用两级缓存的存储结构,其中一级缓存放在cpu内部,用于存储哈希表的头部数据,该片缓存大小有限,但访问速度极快,用于快速查找低冲突率的数据;二级缓存放在外部存储器中,用于存储完整的哈希表,该片缓存大小足够存下整个冲突表,查表时可一次性将整个冲突表完整读出,不占用查找时间;并按以下步骤进行:
步骤一,建表地址维护模块负责将哈希值相同的数据存放在同一片缓存空间内,每一片缓存空间的大小根据应用场景来配,同时并统计每一片缓存空间的已用大小,即每一个冲突表的长度,将这个信息输出给查表地址维护模块,方便后者进行查表长度请求;
步骤二,查表地址维护模块收到查表请求后,根据建表地址维护模块发来的冲突表长度信息决定是从一级缓存还是二级缓存读取数据,当冲突表长度小于一级缓存的深度时,从一级缓存内读取数据,否则从二级缓存读取数据。
本发明的具体步骤为:
一、建表过程,以一个哈希地址的建表为例:
(1)输入当前数据单元的哈希值即哈希地址;
(2)读取对应哈希值为地址的存储空间,记录下其已经存储数据的最后一个地址,该地址即为需存入冲突表的地址;同时统计该存储空间已经存入冲突表的长度,并将此长度输出给查表地址维护模块;
(3)将当前数据单元的存储地址和特征值组成冲突表的写请求信号,控制缓存写操作;
二、查表过程,以一个哈希地址的查表为例:
(1)输入待查找数据单元的哈希值即哈希地址;
(2)查表地址维护模块找出该哈希值对应的存储基地址;
(3)获取该哈希值冲突表的长度;
(4)如果冲突表长度小于一级缓存深度,则向一级缓存发起读命令,否则向二级缓存发起读命令;
(5)读返回所有冲突表的数据,根据冲突表特征值找出查找结果。
本发明的数据存储结构大大简化,不需要链表指针的维护,操作简单不易出错。
实施本发明的优势:1.采用外部存储模块存储哈希表,节约内存资源;2.采用预处理方式查找哈希表,提高查表速度。
附图说明:
图1为本发明的哈希表采用两级缓存的存储结构示意图。
图2为传统的哈希表采用链地址法存储示意图。
图3为本发明的哈希表采用分块顺序地址法的一级缓存存储示意图。
图4为本发明的哈希表采用分块顺序地址法的二级缓存存储示意图。
图5为本发明一个哈希地址的建表过程示意图。
图6为本发明一个哈希地址的查表过程示意图。
具体实施方式:
结合附图对本发明作进一步描述。
如图1所示,一种基于外部存储实现高效查找哈希表的预处理方法,其特征在于:哈希表采用两级缓存的存储结构,其中一级缓存放在cpu内部,用于存储哈希表的头部数据,该片缓存大小有限,但访问速度极快,用于快速查找低冲突率的数据;二级缓存放在外部存储器中,用于存储完整的哈希表,该片缓存大小足够存下整个冲突表,查表时可一次性将整个冲突表完整读出,不占用查找时间;并按以下步骤进行:
步骤一,建表地址维护模块负责将哈希值相同的数据存放在同一片缓存空间内,每一片缓存空间的大小根据应用场景来配,同时并统计每一片缓存空间的已用大小,即每一个冲突表的长度,将这个信息输出给查表地址维护模块,方便后者进行查表长度请求;
步骤二,查表地址维护模块收到查表请求后,根据建表地址维护模块发来的冲突表长度信息决定是从一级缓存还是二级缓存读取数据,当冲突表长度小于一级缓存的深度时,从一级缓存内读取数据,否则从二级缓存读取数据。
传统的哈希表采用链地址法存储,即所有哈希地址相同的数据都被映射到同一个链表中,哈希地址不相同的数据映射到不同的链表中。数据在缓存中的存储格式为如图2所示。
本发明采用分块顺序地址法存储,即所有哈希地址相同的数据顺序存储到同一片存储空间中,哈希地址不相同的数据存储到不同的数据块中,数据在缓冲中的存储格式为如图3、图4所示。
由图3、图4可知,本发明的数据存储结构大大简化,不需要链表指针的维护,操作简单不易出错。
本发明具体步骤如图5、图6所示,
一、建表过程(以一个哈希地址的建表为例),如图5所示:
(1)输入当前数据单元的哈希值即哈希地址;
(2)读取对应哈希值为地址的存储空间,记录下其已经存储数据的最后一个地址,该地址即为需存入冲突表的地址;同时统计该存储空间已经存入冲突表的长度,并将此长度输出给查表地址维护模块;
(3)将当前数据单元的存储地址和特征值组成冲突表的写请求信号,控制缓存写操作;
二、查表过程(以一个哈希地址的查表为例),如图6所示:
(1)输入待查找数据单元的哈希值即哈希地址;
(2)查表地址维护模块找出该哈希值对应的存储基地址;
(3)获取该哈希值冲突表的长度;
(4)如果冲突表长度小于一级缓存深度,则向一级缓存发起读命令,否则向二级缓存发起读命令;
(5)读返回所有冲突表的数据,根据冲突表特征值找出查找结果。