数据存储方法、查找方法及装置与流程

文档序号:11950866阅读:253来源:国知局
数据存储方法、查找方法及装置与流程

本发明涉及数据存储技术领域,具体而言,涉及一种数据存储方法、查找方法及装置。



背景技术:

目前,几乎所有的游戏数值系统,都是通过策划填写表格来完成数值设计的。整个游戏一般情况下都包括了上百张的表格数据,并且随着游戏的维护和新功能的不断开发,表格的内容会变多,表格的数量也会逐渐地增长。这些表格数据一般会通过程序预先写好的导表系统,从excel格式或者csv格式转化为游戏运行系统中的程序语言格式。这些转换后的数据在游戏启动时就会被读取进来,放到内存中,方便随时对表格相关数据的读取。

因为游戏数据的读取是非常频繁的操作,几乎所有的玩法都需要游戏数值的支撑。因此,如何设计表格读取的模式是非常重要的研究课题。常见的表格读取方式一般主要有数据库存储模式和内存存储模式。相比其他模式,从内存中直接读取数据的效率会高很多,并且不需要触发到类似于系统I/O等相关操作。比较常见的转化方式是把数据内容转化为Python的字典。Python字典是基于哈希的方法实现的,虽然索引效率比较高,但由于其键值对元素的定义以及其扩容策略导致Python字典运行时其所占的内存空间过大,而对于游戏而言,内存的占用大小是一个非常关键的因素,因此,需要一种新的用于内存存储数据的存储方法,以使数据在内存中所占的空间尽可能地被压缩。

在所述背景技术部分公开的上述信息仅用于加强对本发明的背景的理解,因此它可以包括不构成对本领域普通技术人员已知的现有技术的信息。



技术实现要素:

本发明提供一种数据存储方法、查找方法及装置,能够数值数据在内存中的大小。

本发明的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本发明的实践而习得。

根据本发明的一方面,提供了一种数据存储方法,包括:根据待存储数据中键值对的个数,为待存储数据创建一存储空间,其中每个键值对包括:键元素与相对应的值元素,针对每个键值对,指向所述键元素地址的指针与指向所述值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息;分别计算每个键值对的键元素的哈希值;根据每个键值对的键元素的哈希值和键值对的个数,分别计算每个键值对的键元素的位置哈希值;以及根据每个键值对的键元素的位置哈希值与所述存储相关信息,分别存储每个键值对。

根据本发明的另一方面,提供了一种数据查找方法,包括:获取存储空间所存储数据中键值对的个数,其中每个键值对包括:键元素与相对应的值元素,针对每个键值对,指向所述键元素地址的指针与指向所述值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息;计算一待查询键元素的哈希值;根据哈希值和键值对的个数,计算待查询键元素的位置哈希值;以及根据该待查询键元素的位置哈希值与所述存储相关信息,查找待查询键元素所对应的值元素。

根据本发明的再一方面,提供了一种数据存储装置,包括:存储空间创建模块,用于根据待存储数据中键值对的个数,为待存储数据创建一存储空间,其中每个键值对包括:键元素与相对应的值元素,针对每个键值对,指向键元素地址的指针与指向值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息;哈希值计算模块,用于分别计算每个键值对的键元素的哈希值;位置哈希值计算模块,用于根据每个键值对的键元素的哈希值和键值对的个数,分别计算每个键值对的键元素的位置哈希值;以及键值对存储模块,用于根据每个键值对的键元素的位置哈希值与存储相关信息,分别存储每个键值对。

根据本发明的再一方面,提供了一种数据查找装置,包括:键值对个数获取模块,用于获取存储空间所存储数据中键值对的个数,其中每个键值对包括:键元素与相对应的值元素,针对每个键值对,指向所述键元素地址的指针与指向所述值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息;哈希值计算模块,用于计算一待查询键元素的哈希值;位置哈希值计算模块,用于根据哈希值和键值对的个数,计算待查询键元素的位置哈希值;以及数据查找模块,用于根据该待查询键元素的位置哈希值与所述存储相关信息,查找待查询键元素所对应的值元素。

根据本发明的数据存储方法,根据每个键值对的键元素的位置哈希值,并利用指向数据对象地址的指针中的预设比特标记与数据存储相关的信息,对待存储数据进行存储,可以有效减少解决内存数据在运行过程中所占用的内存。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本发明。

附图说明

通过参照附图详细描述其示例实施例,本发明的上述和其它目标、特征及优点将变得更加显而易见。

图1是根据一示例性实施方式示出的一种数据存储方法的流程图。

图2是根据一示例性实施方式示出的一种数据查找方法的流程图。

图3是根据一示例性实施方式示出的另一种数据存储方法的流程图。

图4是根据一示例性实施方式示出的另一种数据查找方法的流程图。

图5是根据一示例性实施方式示出的再一种数据存储方法的流程图。

图6是根据一示例性实施方式示出的再一种数据查找方法的流程图。

图7是根据一示例性实施方式示出的一种数据存储装置的框图。

图8是根据一示例性实施方式示出的另一种数据存储装置的框图。

图9是根据一示例性实施方式示出的再一种数据存储装置的框图。

图10是根据一示例性实施方式示出的一种数据查找装置的框图。

图11是根据一示例性实施方式示出的另一种数据查找装置的框图。

图12是根据一示例性实施方式示出的再一种数据查找装置的框图。

具体实施方式

现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本发明将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。附图仅为本发明的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。

此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本发明的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而省略特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知结构、方法、装置、实现或者操作以避免喧宾夺主而使得本发明的各方面变得模糊。

在使用内存存储数据时,数据对象在内存中是对齐的。例如,32位程序为4字节对齐,64位程序为8字节对齐,因此通常情况下32位程序的指向数据对象地址的指针在二进制下的最后2个比特及64位程序指向数据对象地址的指针在二进制下的最后3个比特位均为0。利用该特性,可以将与数据存储相关的信息存储到上述比特位为0的预设比特上。基于此,本发明设计了一种数据存储方法及其对应的数据查找方法,该方法基于上述特性并根据待储存数据中键值对的个数,创建存储空间存储数据。

此外,Python字典是针对各种应用场景而设计的,为了适应各种应用场景所需,其键值对元素的定义以及扩容策略将导致Python字典运行时占用内存过大。而对于游戏系统而言,实际表格数据被存储到内存中后几乎不会发生改动。因此针对游戏系统,为了配合上述数据存储方法与数据查找方法,可以设计一种新的基于Python字典的数据类型,将待存储数据的个数与指向待存储数据空间地址的指针构建于一个数据类型中,例如可以为该新的数据类型命名为:TaggedDict,具体定义如下:

其中变量elem用于存储的是键值对元素,第一个PyObject*为键元素,第二个PyObject*为对应的值元素,变量elem_num用于存储所有的键值对个数。需要说明的是上述各变量的名称仅为示例,而非用于限制本发明。

图1是根据一示例性实施方式示出的一种数据存储方法的流程图。如图1所示,该数据存储方法10包括:

在步骤S101中,根据待存储数据中键值对的个数,为待存储数据创建一存储空间。

其中每个键值对包括:键元素与相对应的值元素。针对每个键值对,指向键元素地址的指针与指向值元素地址的指针均包括:预设比特,用于存储所述键值对的存储相关信息。

在步骤S102中,分别计算每个键值对的键元素的哈希值。

例如,可以使用Python中的PyObject_Hash函数来计算每个键值对的键元素的哈希值。

在步骤S103中,根据每个键值对的键元素的哈希值和待存储数据的键值对的个数,分别计算每个键值对的键元素的位置哈希值。

例如,可以根据公式hash=h%T,计算每个键值对的键元素的位置哈希值,其中hash表示每个键值对的键元素的位置哈希值,h表示每个键值对的键元素的哈希值,T表示待存储数据的键值对的个数。

在步骤S104中,根据每个键值对的键元素的位置哈希值与存储相关的信息,分别存储每个键值对。

根据在步骤S103中计算出的位置哈希值与预设比特中存储的存储相关信息,分别存储每个键值对,以将各键值对存储在存储空间中其键元素的位置哈希值对应的存储位置或其他位置中。

本发明实施方式的数据存储方法,根据每个键值对的键元素的位置哈希值,并利用指向数据对象地址的指针中的预设比特标记与数据存储相关的信息,对待存储数据进行存储,可以有效减少解决内存数据在运行过程中所占用的内存。

应清楚地理解,本发明描述了如何形成和使用特定示例,但本发明的原理不限于这些示例的任何细节。相反,基于本发明公开的内容的教导,这些原理能够应用于许多其它实施方式。

图2是根据一示例性实施方式示出的一种数据查找方法的流程图。该方法对应于图1所示的数据存储方法10。如图2所示,该数据查找方法20包括:

在步骤S201中,获取存储空间所存储数据中键值对的个数。

其中每个所述键值对包括:键元素与相对应的值元素,针对每个键值对,指向键元素地址的指针与指向值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息。

在步骤S202中,计算一待查询键元素的哈希值。

例如,可以使用Python中的PyObject_Hash函数每个键值对的键元素的哈希值。

在步骤S203中,根据该哈希值和键值对的个数,计算该待查询键元素的位置哈希值。

例如,可以根据公式key_hash=key_h%T,计算该待查询键元素的位置哈希值,其中key_hash表示该待查询键元素的位置哈希值,key_h表示该待查询键元素的哈希值,T表示键值对的个数,“%”表示取余计算,即使key_h对T执行取余计算,从而得到key_hash。

在步骤S204中,根据该待查询键元素的位置哈希值与该存储相关信息,查找该待查询键元素所对应的值元素。

此外,针对上述技术原理,根据待存储数据的键值对个数的不同,本发明进一步还设计出另外两种不同的数据存储方法及各自对应的数据查找方法。

以64位程序为例,如上所述其指向对象地址的指针在二进制下的最后3个比特位为0。以上述新设计的数据类型TaggedDict为例,也即两个PyObject*指针共拥有3*2=6个为0的预设比特可用于记录与数据相关的信息,因此共可以表示26=64个不同的数字。针对键值对个数小于64及大于或等于64两种情况,分别设计其各自的数据存储方法与查找方法。

而如果以32位程序为例,如上所述其指向对象地址的指针在二进制下的最后2个比特位为0。以上述新设计的数据类型TaggedDict为例,两个PyObject*指针共拥有2*2=4个为0的预设比特可用于记录与数据相关的信息,因此共可以表示24=16个不同的数字。针对键值对个数小于16及大于或等于16两种情况,分别设计其各自的数据存储方法与查找方法。

也即针对键值对个数小于2N及大于或等于2N两种情况,分别设计其各自的数据存储方法与查找方法,其中N表示键值对的预设比特的个数。

不失一般性的,下面均以64位程序为例说明,32位程序的技术方案同理可得。

图3是根据一示例性实施方式示出的另一种数据存储方法的流程图。该方法适用于待存储数据的键值对个数小于2N的情况。如图3所示,该数据存储方法30包括:

在步骤S301中,根据待存储数据中键值对的个数,为待存储数据创建存储空间。

以采用上述数据类型TaggedDict为例,假设上述数据类型TaggedDict中的elem_num中存储的键值对个数为T,则为待存储数据elem创建一个存储空间,该存储空间的大小为T与一个键值对大小的乘积。并初始化各键值对为NULL对。

在步骤S302中,分别计算每个键值对的键元素的哈希值。

例如,使用Python中的PyObject_Hash函数计算每个键值对的键元素的哈希值h,其中h表示键元素的哈希值。

在步骤S303中,根据每个键值对的键元素的哈希值和待存储数据的键值对的个数,分别计算每个键值对的键元素的位置哈希值。

例如根据公式hash=h%T,计算每个键值对的键元素的位置哈希值,其中hash表示每个键值对的键元素的位置哈希值。

在步骤S304中,针对每个键值对,判断存储空间中该键值对的键元素的位置哈希值对应的存储位置是否被占用,如果未被占用,则进入步骤S305;否则,进入步骤S306。

在步骤S305中,将该键值对存储到其键元素的位置哈希值对应的存储位置,并记录该存储位置为位置哈希值的标记位置。

当该键值对的键元素的位置哈希值对应的存储位置未被占用,即为未发生存储冲突时,把该键值对直接插入到该位置哈希值对应的存储位置,同时记录该存储位置为位置哈希值的标记位置。例如可以使用一个数据结构M,记录位置哈希值为hash的链的最后一个键值对的存储位置,即M[hash]=hash,其中M[hash]为位置哈希值为hash的标记位置。

在步骤S306中,将键值对加入到一待处理队列中。

当该键值对的键元素的位置哈希值对应的存储位置未被占用,即为发生存储冲突时,把发生了冲突的键值对先放到一个待处理队列中。

在步骤S307中,依次处理该待处理队列中的键值对,以将该待处理队列中的各键值对存储到存储空间中。

在本步骤中,针对待处理队列中的每个键值对,又可以包括如下处理步骤:

1.将键值对存储到存储空间中一未被占用的存储位置。

例如,可以将该键值对存储到存储空间中当前第一个未被占用的存储位置。

2.根据该键值对的键元素的位置哈希值,获取该存储空间中该位置哈希值的标记位置对应的存储位置所存储的键值对,将该未被占用的存储位置记录到所存储的键值对的预设比特中位置哈希值。

假设该未被占用的位置为position,可以从上述数据结构M中知道具有同一个位置哈希值的链的最后一个键值对的存储位置(即标记位置M[hash]),然后把position信息标记到标记位置M[hash]所存储的键值对的6bit的预设比特中。譬如position是51(二进制110011),则elem中M[hash]对应的键值对的键元素和值元素的最后3个预设比特分别是110和011。也即存储在预设比特中的用于存储键值对的存储相关信息包括该未被占用的位置position。

3.将该未被占用的存储位置更新到该键值对的键元素的位置哈希值的标记位置。

即更新该键值对的键元素的位置哈希值的标记位置M[hash]=position,表示具有该位置哈希值hash的链的最后一个键值对现在在位置哈希值对应的标记位置即position上。

进一步地,因为存储空间中存储位置的范围是[0,…,63],因此我们可以使用63(二进制111111)来表示链的终止,即当键值对为待处理队列中具有相同位置哈希值的最后一个键值对时,将一特定预设值(如111111)记录到该键值对的预设比特中,以表示该链已结束。

本发明实施方式的数据存储方法,针对待存储数据的键值对个数小于2N的情况,使用每个键值对的预设比特记录各位置哈希值的标记位置,即每个位置哈希值的链的最后一个键值对当前的存储位置,从而根据键值对的位置哈希值与对应的标记位置值,存储待存储数据中的各键值对,以压缩存储数据的内存占用大小。

图4是根据一示例性实施方式示出的另一种数据查找方法的流程图。该方法对应于图3所示的数据存储方法30。如图4所示,该数据查找方法40包括:

在步骤S401中,获取存储空间存储数据中键值对个数。

其中每个所述键值对包括:键元素与相对应的值元素,针对每个键值对,指向键元素地址的指针与指向值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息。

在步骤S402中,计算一待查询键元素的哈希值。

例如,可以使用Python中的PyObject_Hash函数每个键值对的键元素的哈希值。

在步骤S403中,根据该哈希值和键值对的个数,计算待查询键元素的位置哈希值。

例如,可以根据公式key_hash=key_h%T,计算该待查询键元素的位置哈希值,其中key_hash表示该待查询键元素的位置哈希值,key_h表示该待查询键元素的哈希值,T表示键值对的个数。

在步骤S404中,计算存储空间中该位置哈希值对应的存储位置中存储的键值对的键元素的位置哈希值。

例如,可以根据公式item_hash=item_h%T,计算存储的键值对的键元素的位置哈希值,其中item_hash表示存储的键值对的键元素的位置哈希值,item_h表示存储的键值对的键元素的哈希值,T表示键值对的个数。

在步骤S405中,判断待查询键元素的位置哈希值与存储的键值对的键元素的位置哈希值是否相等,如果不相等,则进入步骤S406;否则,进入步骤S407。

在步骤S406中,指示待查询键元素不在该存储空间中。

当待查询键元素的位置哈希值与存储的键值对的键元素的位置哈希值不相等时,根据上述的数据存储方法,说明该待查询键元素一定不在该存储空间中。

在步骤S407中,判断该存储的键值对的键元素是否等于该待查询键元素,如果相等,则进入步骤S408;否则进入步骤S409。

当待查询键元素的位置哈希值与存储的键值对的键元素的位置哈希值相等时,根据上述的数据存储方法,说明该存储位置一定是具有相同位置哈希值的链的开始位置,则判断该存储的键值对的键元素是否等于该待查询键元素。

在步骤S408中,返回该存储的键值对的值元素。

在步骤S409中,获取存储的键值对的预设比特中记录的数值,确定与该待查询键元素具有相同位置哈希值的下一个存储的键值对的存储位置,以查找该待查询键元素所对应的值元素。

例如,取出item_hash对应存储位置中的键值对中所标记的6bit的预设比特中的数值,便可以知道具有相同位置哈希值的链的下一个键值对的存储位置。

如果存储的该下一个键值对的键元素与待查询键元素仍不相等,重复执行步骤S409,直到查找到与该待查询键元素对应的值元素,或遍历完具有该相同位置哈希值的链中的所有键值对。

经证明,上述数据存储方法中所构建的哈希表的时间为线性时间O(T);对应查找方法中,每次数据查询的时间为O(1)。

图5是根据一示例性实施方式示出的再一种数据存储方法的流程图。该方法适用于待存储数据的键值对个数大于或等于2N的情况。如图5所示,该数据存储方法50包括:

在步骤S501中,根据待存储数据中键值对的个数,为待存储数据创建存储空间。

以采用上述数据类型TaggedDict为例,假设上述数据类型TaggedDict中的elem_num中存储的键值对个数为T,则为待存储数据则为待存储数据elem创建一个存储空间,该存储空间的大小为与一个键值对的大小的乘积。并初始化各键值对为NULL对。其中该阈值例如可以为1.2。

在步骤S502中,分别计算每个键值对的键元素的哈希值。

例如,使用Python中的PyObject_Hash函数计算每个键值对的键元素的哈希值h,其中h表示键元素的哈希值。

在步骤S503中,根据每个键值对的键元素的哈希值和待存储数据的键值对的个数,分别计算每个键值对的键元素的位置哈希值。

例如根据公式hash=h%T,计算每个键值对的键元素的位置哈希值,其中hash表示每个键值对的键元素的位置哈希值。

在步骤S504中,针对每个键值对,判断存储空间中该键值对的键元素的位置哈希值对应的存储位置是否被占用,如果未被占用,则进入步骤S505;否则,进入步骤S506。

在步骤S505中,将该键值对存储到其键元素的位置哈希值对应的存储位置,并将该键值对的键元素的哈希值的部分或全部记录到该键值对的预设比特中。

以上述6个预设比特为例,将该键值对的键元素的哈希值记录到该6比特中,而如果哈希值大于6比特,则例如可以将其后6个比特记录到该6个预设比特中。也即存储在预设比特中的用于存储键值对的存储相关信息包括所存储的键值对的键元素的哈希值的部分或全部。

在步骤S506中,根据键值对的键元素的位置哈希值,计算其新的位置哈希值。

例如,根据公式hash_new=(hash+1)%T,计算其新的位置哈希值,其中hash_new表示新的位置哈希值,hash表示之前的位置哈希值,T表示键值对的个数。

在步骤S507中,将该键值对存储到该新的位置哈希值对应的存储位置,并将该键值对的键元素的哈希值的部分或全部记录到该键值对的预设比特中。

重复判断新的位置哈希值对应的存储位置是否被占用,如果没有被占用,则将该键值对存储到该新的位置哈希值所对应的存储位置上,并记录其部分或全部的哈希值至其预设比特中;而如果仍被占用,则按照步骤S506中的计算方法,再次计算新的位置哈希值,直到所计算的新的位置哈希值所对应的存储位置未被占用为止。

本发明实施方式的数据存储方法,针对待存储数据的键值对个数大于或等于2N的情况,当每个键值对被存储时,使用每个键值对的预设比特记录该键值对的键元素的部分或全部的哈希值,从而根据键值对的位置哈希值,存储待存储数据中的各键值对,以压缩存储数据的内存占用大小。

图6是根据一示例性实施方式示出的再一种数据查找方法的流程图。该方法对应于图5所示的数据存储方法50。如图6所示,该数据查找方法60包括:

在步骤S601中,获取存储空间存储数据中键值对个数。

其中每个所述键值对包括:键元素与相对应的值元素,针对每个键值对,指向键元素地址的指针与指向值元素地址的指针均包括:预设比特,用于存储键值对的存储相关信息。

在步骤S602中,计算一待查询键元素的哈希值。

例如,可以使用Python中的PyObject_Hash函数计算每个键值对的键元素的哈希值。

在步骤S603中,根据该哈希值和键值对的个数,计算待查询键元素的位置哈希值。

例如,可以根据公式key_hash=key_h%T,计算该待查询键元素的位置哈希值,其中key_hash表示该待查询键元素的位置哈希值,key_h表示该待查询键元素的哈希值,T表示键值对的个数。

在步骤S604中,判断存储空间中该位置哈希值对应的存储位置是否存储有键值对,如果没有,则进入步骤S605;否则,进入步骤S606。

也即判断该存储空间中该位置哈希值key_hash对应的存储位置是否为空。如果为空,表明该待查询键值未存储于该存储空间中。

在步骤S605中,指示待查询键元素不在该存储空间中。

当待查询键元素的位置哈希值与存储的键值对的键元素的位置哈希值不相等时,根据上述的数据存储方法,说明该待查询键元素一定不在该存储空间中。

在步骤S606中,判断该存储的键值对的预设比特中数值是否等于该待查询键元素的哈希值的部分或全部,如果相等,则进入步骤S607;如果不相等,进入步骤S609。

对于不相等的情况,直接进入步骤S609,寻找下一个存储的键值对。这样做的技术效果在于可以快速排出一部分哈希值不相等的匹配结果,对于这些不相等的匹配结果可以避免使用复杂度较高的PyObject_RichCompareBool函数进行键元素的比较,从而提高了查询的效率。

在步骤S607中,判断存储的键值对的键元素是否等于待查询键元素,如果相等,则进入步骤S608;否则,进入步骤S609。

当该存储的键值对的预设比特中数值等于该待查询键元素的哈希值的部分或全部时,继续比较存储的键值对的键元素是否等于待查询键元素,如果一致,再判断存储的键值对的键元素是否等于待查询键元素,例如可以使用Python的PyObject_RichCompareBool函数进行键元素的比较。

在步骤S608中,返回该存储的键值对的值元素。

在步骤S609中,确定与待查询键元素具有相同位置哈希值的下一个存储的键值对的存储位置,以查找待查询键元素所对应的值元素。

例如,根据公式item_hash_new=(item_hash+1)%T,计算新的位置哈希值,其中item_hash_new表示新的位置哈希值,item_hash表示存储的键值对的键元素的位置哈希值,并确定下一个存储的键值对的存储位置为新的位置哈希值对应的存储位置。

继续对下一个存储位置所存储的键值对执行上述从步骤S607开始的各步骤,直到查找出该待查询键元素对应的值元素,或遇到一个空(NULL)的元素。

经证明,上述数据存储方法中所构建的哈希表的时间为线性时间O(T);对应查找方法中,每次数据查询的时间为O(1)。

经测试验证,本发明各实施方式所提供的上述数据存储方法及相应的数据查找方法,能够在查询性能轻微下降的情况下,尽可能地压缩数据在内存中的占用大小。当采用250个表格数据,并生成100万条查询数据进行查询测试时,下表记录了查询总耗时以及数据在内存中的占用大小,数据如下:

通过表格可以知道,本发明提出一种数据存储方法及对应的查找方法,在查询性能有略微损耗(大概5%左右的下降)的情况下,可以把游戏数值数据在内存中的占用量压缩至原来的50%~55%,大大减少了内存占用量。

本领域技术人员可以理解实现上述实施方式的全部或部分步骤被实现为由CPU执行的计算机程序。在该计算机程序被CPU执行时,执行本发明提供的上述方法所限定的上述功能的程序可以存储于一种计算机可读存储介质中,该存储介质可以是只读存储器,磁盘或光盘等。

此外,需要注意的是,上述附图仅是根据本发明示例性实施方式的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。

下述为本发明装置实施例,可以用于执行本发明方法实施例。对于本发明装置实施例中未披露的细节,请参照本发明方法实施例。

图7是根据一示例性实施方式示出的一种数据存储装置的框图。如图7所示,该数据存储装置70包括:存储空间创建模块701、哈希值计算模块702、位置哈希值计算模块703及键值对存储模块704。

其中,存储空间创建模块701用于根据待存储数据中键值对的个数,为所述待存储数据创建一存储空间,其中每个所述键值对包括:键元素与相对应的值元素,针对每个所述键值对,指向所述键元素地址的指针与指向所述值元素地址的指针均包括:预设比特,用于存储所述键值对的存储相关信息。

哈希值计算模块702用于分别计算每个所述键值对的键元素的哈希值;

位置哈希值计算模块703用于根据每个所述键值对的键元素的哈希值和所述键值对的个数,分别计算每个所述键值对的键元素的位置哈希值。

在一些实施例中,位置哈希值计算模块703还用于根据公式hash=h%T,计算每个所述键值对的键元素的位置哈希值,其中hash表示每个所述键值对的键元素的位置哈希值,h表示每个所述键值对的键元素的哈希值,T表示所述键值对的个数。

键值对存储模块704用于根据每个所述键值对的键元素的位置哈希值与所述存储相关信息,分别存储每个所述键值对。

在一些实施例中,指向所述存储空间的指针与所述键值对的个数构造于一数据类型中。

图8是根据一示例性实施方式示出的另一种数据存储装置的框图。该装置适用于待存储数据的键值对个数小于2N的情况。与图7所示的数据存储装置70不同之处在于,图8所示的数据存储装置80中的键值对存储模块804进一步包括:第一存储子模块8041及队列处理子模块8042。

其中,第一存储子模块8041用于针对每个所述键值对,当所述存储空间中所述键值对的键元素的位置哈希值对应的存储位置未被占用时,将所述键值对存储到所述位置哈希值对应的存储位置,并记录所述存储位置为所述位置哈希值的标记位置;当所述存储空间中所述位置哈希值对应的存储位置被占用时,将所述键值对加入到一待处理队列中。

队列处理子模块8042用于依次对所述待处理队列中的每个所述键值对进行处理,其具体包括:存储单元、位置记录单元及标记位置更新单元。

其中存储单元用于将所述键值对存储到所述存储空间中一未被占用的存储位置。

位置记录单元用于根据所述键值对的键元素的位置哈希值,获取所述位置哈希值的标记位置对应的存储位置所存储的键值对,并将所述未被占用的存储位置记录到所述存储的键值对的所述预设比特中。

标记位置更新单元用于将所述未被占用的存储位置更新到所述键元素的位置哈希值的标记位置。

在一些实施例中,队列处理子模块8042还包括特定键值对处理单元,用于当所述键值对为所述待处理队列中具有相同位置哈希值的最后一个键值对时,将一特定预设值记录到所述键值对的所述预设比特中。

图9是根据一示例性实施方式示出的再一种数据存储装置的框图。该装置适用于待存储数据的键值对个数大于或等于2N的情况。与图7所示的数据存储装置70不同之处在于,图9所示的数据存储装置90中的键值对存储模块904进一步包括:第二存储子模块9041,用于针对每个所述键值对,当所述存储空间中所述键值对的键元素的位置哈希值对应的存储位置未被占用时,将所述键值对存储到所述位置哈希值对应的存储位置,并将所述键值对的键元素的哈希值的部分或全部记录到所述键值对的所述预设比特中;当所述存储空间中所述位置哈希值对应的存储位置被占用时,根据所述键值对的键元素的位置哈希值,计算其新的位置哈希值;当所述存储空间中所述新的位置哈希值对应的存储位置未被占用时,将所述键值对存储到所述新的位置哈希值对应的存储位置,并将所述键值对的键元素的哈希值的部分或全部记录到所述键值对的所述预设比特中。

在一些实施例中,上述根据所述键值对的键元素的位置哈希值,计算其新的位置哈希值包括:根据公式hash_new=(hash+1)%T,计算其新的位置哈希值,其中hash_new表示所述新的位置哈希值,hash表示所述位置哈希值,T表示所述键值对的个数。

图10是根据一示例性实施方式示出的一种数据查找装置的框图。如图10所示,该数据查找装置100包括:键值对个数获取模块1001、哈希值计算模块1002、位置哈希值计算模块1003及数据查找模块1004。

其中,键值对个数获取模块1001用于获取存储空间所存储数据中键值对的个数,其中每个所述键值对包括:键元素与相对应的值元素,针对每个所述键值对,指向所述键元素地址的指针与指向所述值元素地址的指针均包括:预设比特,用于存储所述键值对的存储相关信息。

哈希值计算模块1002用于计算一待查询键元素的哈希值。

位置哈希值计算模块1003用于根据所述哈希值和所述键值对的个数,计算所述待查询键元素的位置哈希值。

在一些实施例中,位置哈希值计算模块1003还用于根据公式key_hash=key_h%T,计算所述待查询键元素的位置哈希值,其中key_hash表示所述待查询键元素的位置哈希值,key_h表示所述待查询键元素的哈希值,T表示所述键值对的个数。

数据查找模块1004用于根据所述存储的键值对的键元素的位置哈希值与所述存储相关信息,查找所述待查询键元素所对应的值元素。

在一些实施例中,指向所述存储空间的指针与所述键值对的个数构造于一数据类型中。

图11是根据一示例性实施方式示出的另一种数据查找装置的框图。该装置适用于待存储数据的键值对个数小于2N的情况。与图10所示的数据查找装置100不同之处在于,图11所示的数据查找装置110中的数据查找模块1104进一步包括:位置哈希值计算子模块11041、键元素判断子模块11042及值元素查找子模块11043。

位置哈希值计算子模块11041用于计算所述存储空间中所述待查询键元素的位置哈希值对应的存储位置中存储的键值对的键元素的位置哈希值。

在一些实施例中,位置哈希值计算子模块11041还用于根据公式item_hash=item_h%T,计算所述存储的键值对的键元素的位置哈希值,其中item_hash表示所述存储的键值对的键元素的位置哈希值,item_h表示所述存储的键值对的键元素的哈希值,T表示所述键值对的个数。

键元素判断子模块11042用于当所述待查询键元素的位置哈希值与所述存储的键值对的键元素的位置哈希值相等时,判断所述存储的键值对的键元素是否等于所述待查询键元素。

值元素查找子模块11043用于当所述存储的键值对的键元素等于所述待查询键元素时,返回所述存储的键值对的值元素;当所述存储的键值对的键元素不等于所述待查询键元素时,获取所述存储的键值对的所述预设比特中记录的数值;根据所述数值,确定与所述待查询键元素具有相同位置哈希值的下一个存储的键值对的存储位置,以查找所述待查询键元素所对应的值元素。

图12是根据一示例性实施方式示出的再一种数据查找装置的框图。该装置适用于待存储数据的键值对个数小于2N的情况。与图10所示的数据查找装置100不同之处在于,图12所示的数据查找装置120中的数据查找模块1204进一步包括:第一判断子模块12041、第二判断子模块12042及值元素查找子模块12043。

其中第一判断子模块12041用于当所述待查询键元素的位置哈希值所对应的存储位置中存储有键值对时,判断所述存储的键值对的预设比特中记录的数值是否等于所述待查询键元素的哈希值的部分或全部。

第二判断子模块12042用于当所述存储的键值对的所述预设比特中记录的数值等于所述待查询键元素的哈希值的部分或全部时,判断所述存储的键值对的键元素是否等于所述待查询键元素。

值元素查找子模块12043用于当所述存储的键值对的键元素等于所述待查询键元素,返回所述存储的键值对的值元素;当所述存储的键值对的键元素不等于所述待查询键元素时,根据所述存储的键值对的键元素的位置哈希值,确定与所述待查询键元素具有相同位置哈希值的下一个存储的键值对的存储位置,以查找所述待查询键元素所对应的值元素。

在一些实施例中,上述根据所述存储的键值对的键元素的位置哈希值,确定与所述待查询键元素具有相同位置哈希值的下一个存储的键值对的存储位置包括:根据公式item_hash_new=(item_hash+1)%T,计算新的位置哈希值,其中item_hash_new表示所述新的位置哈希值,item_hash表示所述存储的键值对的键元素的位置哈希值,T表示所述键值对的个数,以及确定所述下一个存储的键值对的存储位置为所述新的位置哈希值对应的存储位置。

需要注意的是,上述附图中所示的框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本发明实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、移动终端、或者网络设备等)执行根据本发明实施方式的方法。

以上具体地示出和描述了本发明的示例性实施方式。应可理解的是,本发明不限于这里描述的详细结构、设置方式或实现方法;相反,本发明意图涵盖包含在所附权利要求的精神和范围内的各种修改和等效设置。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1