一种Queue容器的实现方法和装置与流程

文档序号:25212507发布日期:2021-05-28 14:08阅读:80来源:国知局
一种Queue容器的实现方法和装置与流程

本发明涉及计算机技术领域,特别涉及一种队列(queue)容器的实现方法和装置。



背景技术:

数据处理过程中经常需要使用queue进行数据存储,java中通常使用的queue为jdk提供的linkedblockingqueue。

jdk提供的linkedblockingqueue中,使用带头指针head和尾指针last的单链表实现,头指针head直接指向队头的第一个节点(node)对象,尾指针last指向队尾的最后一个节点,其结构如图1所示,每个节点对象中包括两部分内容:指向数据位置的引用地址(指针)、指向下一节点的引用地址(指针),其中,指向数据位置的引用地址中存储的是数据对象,而数据对象中包括对象描述信息、value数据等信息。

从图1可以看出,使用linkedblockingqueue进行数据存储时,每个value数据都需要使用一个节点对象和一个数据对象,而业务数据处理所针对的有效数据信息实际上只是value数据对象中的value数据,其它数据信息则与业务数据处理无关但是却额外占用了较多的内存空间。以int类型的value数据为例,当使用linkedblockingqueue进行存储时,value数据自身只占用4字节(byte),然而,与其存储相关的node对象中,两个引用地址共占用8字节,另外,与其相关的数据对象中的对象描述信息也要占用一定内存空间,可以看出,这些额外占用的内存空间比value数据本身占用的空间还要多很多。可以看出,现有linkedblockingqueue的实现中存在大量的内存资源浪费。



技术实现要素:

有鉴于此,本发明的目的在于提供一种queue容器的实现方法和装置,能够减少内存资源浪费。

为了达到上述目的,本发明提供了如下技术方案:

一种queue容器的实现方法,包括:

创建预设基本数据类型的数组,将所述数组作为所述queue容器的底层存储数据结构;

对于使用所述queue容器进行数据存储的任一基本数据类型,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n;n为正整数;

基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取。

一种queue容器的实现装置,包括:

创建单元,用于创建预设基本数据类型的数组,将所述数组作为所述queue容器的底层存储数据结构;

确定单元,用于对于使用所述queue容器进行数据存储的任一基本数据类型,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n;n为正整数;

处理单元,用于基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取。

一种电子设备,包括:至少一个处理器,以及与所述至少一个处理器通过总线相连的存储器;所述存储器存储有可被所述至少一个处理器执行的一个或多个计算机程序;所述至少一个处理器执行所述一个或多个计算机程序时实现上述queue容器的实现方法中的步骤。

一种计算机可读存储介质,所述计算机可读存储介质存储一个或多个计算机程序,所述一个或多个计算机程序被处理器执行时实现上述queue容器的实现方法中的步骤。

由上面的技术方案可知,本发明中,以预设基本数据类型的数组作为queue容器的底层存储数据结构,对于所述任一基本数据类型的数据的存储和读取,均基于所述任一基本数据类型对应于所述预设基本数据类型的转换长度在所述数组中进行,所述任一基本数据类型的数据不再以对象形式存储,因此不需要浪费额外的对象描述信息,另外,也不再采用包括指向数据位置的引用地址和指向下一节点的引用地址的节点对数据进行链式存储,也可以节省内存空间的占用。因此可以看出,应用本发明的方法实现的queue容器,可以大大减少内存资源浪费。

附图说明

图1是现有技术linkedblockingqueue的数据结构示意图;

图2是本发明实施例一queue容器的实现方法流程图;

图3是本发明实施例二queue容器的实现方法流程图;

图4是本发明实施例queue容器中的底层存储数据结构示意图;

图5是本发明实施例queue容器中的数据存储示意图;

图6是本发明实施例queue容器中的数据读取示意图;

图7是本发明实施例queue容器的实现装置的结构示意图;

图8是本发明实施例提供的电子设备的结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图并据实施例,对本发明的技术方案进行详细说明。

在现有的计算机语言中,例如java、c++等,都有基本数据类型的概念。本发明实施例中,针对与linkedblockingqueue的实现机制类似的、存在内存资源浪费的各类计算机语言提供的queue容器进行改进,提出了一种利用该类计算机语言支持的基本数据类型实现的适用于该类计算机语言的新的queue容器的实现方法。

参见图2,图2是本发明实施例一queue容器的实现方法流程图,如图2所示,该方法包括以下步骤:

步骤201、创建预设基本数据类型的数组,将所述数组作为所述queue容器的底层存储数据结构。

本发明实施例中,所述基本数据类型根据实现queue容器所采用的计算机语言的不同而不同。例如,采用java语言实现queue容器时,所述基本数据类型是指java支持的所有基本数据类型(包括:byte、short、int、long、float、double、boolean、char共8种基本数据类型),而本步骤201中所述预设基本数据类型则可以是java支持的以上8种基本数据类型中的任意一种。

步骤202、对于使用所述queue容器进行数据存储的任一基本数据类型,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n;n为正整数。

在实际应用中,不同的基本数据类型,其长度可能相同也可能不同,例如在java中,byte、short、int、long、float、double、boolean、char的长度分别为:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)、boolean(通常是4字节)、char(2字节)。

本发明实施例中,由于所述预设基本数据类型和所述任一基本数据类型可能是不同的基本数据类型,使用所述queue容器进行所述任一基本数据类型的数据存储时,需要先确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n,然后基于此长度n在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取,此长度n是根据所述任一基本数据类型的长度和所述预设基本数据类型的长度来确定的,后续会进行详细介绍。

步骤203、基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取。

本发明实施例中基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取,即在存储时,需要先将所述任一基本数据类型的待存储数据转换为n个所述预设基本数据类型的数据,再将转换得到的n个数据存入作为queue容器的底层存储数据结构的数组中;在读取时,先从作为queue容器的底层存储数据结构的数组中读取n个数据,再将读取的n个数据转换为所述任一基本数据类型的数据。

从以上本发明实施例可以看出,本发明中,通过构建预设基本数据类型的数组作为queue容器的底层存储数据结果,根据所述任一基本数据类型对应于所述预设基本数据类型的转换长度n,在所述queue容器维护的数组中进行数据的读取和存储,不需要使用额外的指向数据位置的引用地址和指向下一节点的引用地址,而数据本身也不是以对象形式存储,而是以预设基本数据类型的形式存储,因此,也不需要存储额外的对象描述信息,因此,可以节省大量的内存空间。另外,由于所述queue容器是使用所述预设基本数据类型的数组对数据进行存储,而整个数组都可以被加载到高速缓存中进行数据的存储和读取,因而还可以充分利用cpu的高速缓存,加快数据的存取速度。

参见图3,图3是本发明实施例二queue容器的实现方法流程图,如图3所示,该方法主要包括以下步骤:

步骤301、创建预设基本数据类型的数组,将所述数组作为所述queue容器的底层存储数据结构。

本发明实施例中,以java为例,将java的基本数据类型:byte作为预设基本数据类型。

步骤302、对于使用所述queue容器进行数据存储的任一基本数据类型,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n;n为正整数。

本发明实施例中,所述确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n的方法具体如下:

计算所述任一基本数据类型的长度与所述预设基本数据类型的长度的商;

将所述商的向上取整结果确定为所述任一基本数据类型对应于所述预设基本数据类型的转换长度n。

以所述任一基本数据类型为int为例,int的长度是4字节,byte的长度是1字节,因此,可以确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n是对4余1的商值向上取整,最终得到n=4。

以所述预设基本数据类型为byte,所述任一基本数据类型为int为例,则本发明实施例所提供的所述queue的数据结构如图4所示:所述queue容器维护数据元素是byte的数组,在所述数组中,每4个连续的数据元素可对应存放一个int数据。所述queue容器还维护有头指针和尾指针,其中,所述头指针指向最先存入所述queue容器维护的数组中的数据的起始位置;所述尾指针指向最后存入所述queue容器维护的数组中的数据的结束位置。

步骤303、当需要向所述queue存入所述任一数据类型的待存储数据时,将待存储数据转换为n个所述预设基本数据类型的数据,从所述queue容器维护的尾指针指向的所述数组中的位置开始顺序存入转换后的n个数据,并对所述queue容器的尾指针指向所述数组中的位置进行更新。

本步骤303实现的主要功能是:基于所述任一基本数据类型对应于所述预设基本数据类型的转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储。

以下结合图4进行举例说明:假设所述queue容器中已经存入了两个int类型的数据,尚未从所述queue容器中读取数据,即如图4所示,头指针指向所述queue容器维护的数组quea[]的起始位置(即quea[0]所在位置),quea[0]至quea[3]存放第一个int数据,quea[4]至quea[7]存放第二个int数据,尾指针执向quea[7]的结束位置(即quea[8]所在位置)。

当需要向所述queue存入所述任一数据类型的待存储数据时,可以先将待存储数据转换为n个所述预设基本数据类型的数据,具体转换过程如下(int数据向byte数据转换):

x[0]=(byte)(待存储数据&0xff);

x[1]=(byte)(待存储数据>>8&0xff);

x[2]=(byte)(待存储数据>>16&0xff);

x[3]=(byte)(待存储数据>>24&0xff);

其中,

上述公式x[0]=(byte)(待存储数据&0xff)表示:将待存储数据的第0至7bit的数据转换为x[0],即待存储数据[0-7]bit→x[0];

上述公式x[1]=(byte)(待存储数据>>8&0xff)表示:将待存储数据的第8至15bit的数据转换为x[1](即:待存储数据[8-5]bit→x[1]);

上述公式x[2]=(byte)(待存储数据>>16&0xff)表示:将待存储数据的第16至23bit的数据转换为x[2](即:待存储数据[16-23]bit→x[2]);

上述公式x[3]=(byte)(待存储数据>>24&0xff)表示:将待存储数据的第24至31bit的数据转换为x[3](即:待存储数据[24-31]bit→x[3]);

通过以上四个公式,可以将待存储数据转化为4个byte类型的数据,即x[0]、x[1]、x[2]、x[3]。

之后,就可以从所述queue容器维护的尾指针指向的所述数组中的位置开始顺序存入转换后的4个数据,具体如图5所示,将x[0]、x[1]、x[2]、x[3]依次存放在quea[8]、quea[9]、quea[10]、quea[11]这四个位置,而所述queue容器维护的尾指针则随即更新为指向quea[11]的结束位置(即quea[12]所在位置)。

至此,将一个int类型的待存储数据存储到所述queue容器的过程结束。

步骤304、当需要从所述queue读取所述任一数据类型的数据时,从所述queue容器维护的头指针指向的所述数组中的位置开始顺序读取n个数组元素,将顺序读取的n个数据转换为所述任一基本数据类型的数据,并对所述queue容器维护的头指针指向所述数组中的位置进行更新。

本步骤304实现的主要功能是:基于所述任一基本数据类型对应于所述预设基本数据类型的转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的读取。

以下结合图4进行举例说明:假设所述queue容器中已经存入了二个int类型的数据,尚未从所述queue容器中读取数据,即如图4所示,头指针指向所述queue容器数组quea[]的起始位置(即quea[0]所在位置),quea[0]至quea[3]存放第一个int数据,quea[4]至quea[7]存放第二个int数据,尾指针执向quea[7]的结束位置(即quea[8]所在位置)。

当需要从所述queue读取所述任一数据类型的数据时,可以先从所述queue容器维护的头指针指向的所述数组quea[]中的位置开始顺序读取n个数组元(n=4),即读取出quea[0]、quea[1]、quea[2]、quea[3],同时将所述queue容器维护的头指针更新为指向quea[4]所在位置,具体如图6所示。

之后,采用以下公式:待读取数据=(byte[0]&0xff)<<24)|(byte[1]&0xff)<<16)|(byte[2]&0xff)<<8)|(byte[3]&0xff)<<0),将读取的4个byte类型的数组元素转换为一个int数据,此int数据即为待读取数据。

至此,从所述queue容器中读取一个int类型的待读取数据的过程结束。

以上是对所述预设基本数据类型是byte,所述任一基本数据类型为int为例,对在所述queue容器中存储和读取数据的过程进行说明。在实际应用中,所述预设基本数据类型是byte时,还可以实现其它基本数据类型的存储与读取,在进行存储和读取的过程中主要涉及到n个byte类型和其它基本数据类型之间的互相转换,其转化原理与对int类型的数据的存储和读取过程中的转换原理相同,不再赘述。

另外,所述预设基本数据数据类型也可以是除byte以外的其它基本数据类型,例如short、int等,需要注意的是,当采用byte以外的基本数据类型作为所述预设基本数据类型时,如果使用queue容器进行长度小于所述预设基本数据类型的其它数据类型的数据的存储时,会存在少量内存浪费的情况,例如所述预设基本数据类型是short时,如果使用queue容器存储byte类型的数据,则由于byte本来只需要占用1字节,但是在queue容器中存储时实际是占用2个字节(即占用一个short类型的数组元素的长度)。然而对于这种情况,即使存在内存空闲浪费,相对于现有技术中linkedblockingqueue的数据结构来说,仍然是节省内存空间的。

图3所示本发明实施例中,由于采用数组作为所述queue容器的底层存储数据结构,而数组的长度初始可能只会设置一个较小的数组以避免内存空间浪费,但是,随着存入所述queue容器的数据的增多,初始数组长度可能不足以支撑后续的数据存储需求,这种情况下,可以对queue容器进行扩容,具体来说,是重新创建一个长度更大的数组,将原有数组中的数据拷贝到新创建的长度更大的数组中,然后用新创建的长度更大的数组取代原有数组。

因此,图3所示本发明实施例中,还可以进一步通过以下步骤对所述queue容器进行扩容:

s1、当所述queue容器维护的所述数组中存储的数组元素的个数超出所述数组的数组长度的预设比例,且所述数组的数组长度小于预设最大数组长度时,对所述数组的数组长度进行扩充;

s2、基于扩充后的数组长度创建所述预设基本数据类型的新的数组;

s3、将所述queue容器维护的所述数组中的数据按照存入的先后顺序依次存入新的数组,并将所述queue容器维护的头指针指向最先存入新的数组中的数据的起始位置,将所述queue容器维护的尾指针指向最后存入新的数组中的数据的结束位置;

s4、用新的数组取代所述queue容器维护的所述数组作为所述queue容器的底层存储数据结构,并删除所述queue容器维护的所述数组。

其中,上述步骤s1中,对所述数组的数组长度进行扩充,可采用多种方式实现,例如,将所述数组的数组长度增加一个固定长度值;或者,将所述数组的数组长度与预设扩充因子的乘积座位扩充后的数组长度。

另外,为了重复利用所述queue容器维护的所述数组中存储空间,可以对queue容器采用顺序循环队列机制,即:当所述queue容器维护的尾指针已经指向所述数组的末尾时,如果所述queue容器维护的头指针指向的不是所述数组的起始位置(随着不断从所述queue容器维护的所述数组中读取数据,所述queue容器维护的头指针会不断更新,逐渐指向远离所述数组的起始位置,使得所述数组的起始位置空置),则再有新的数据存入,则可以重新从在所述数组的开始位置开始存储新的数据,直至尾指针和头指针指向相同位置,所述数组的存储空间用尽,此时若queue容器已经达到最大容量,不允许再扩容的话,则后续不能再存入新的数据。这里需要说明的是,所述queue容器的头指针和尾指针指向相同位置,除了上述数组的存储空间用尽的情况外,还有另外一种情况,即:尚未有任何数据存入所述数组。

另外,在图3所示本发明实施例中,还可以根据所述queue容器中的所述任一基本数据类型对应于所述预设基本数据类型的转换长度n、所述queue容器维护的头指针和尾指针,确定所述queue容器中存储的所述任一基本数据类型的数据个数,具体可以采用以下公式:(尾指针-头指针)/n,来计算得到。

实践证明,应用本发明实施例提供的方法实现的queue容器,其内存使用量为jdk提供的linkedblockingqueue的40%左右。而且,由于queue容器是将所有数据以基本数据类型的形式(而非对象的形式)存储在数组中,可以充分利用cpu高速缓存,与jdk提供的linkedblockingqueue相比,读取数据的速度更快。另外,应用本发明实施例提供的方法实现的queue容器,还可以适用于多种使用场景(即不同基本数据类型对应的使用场景)。

以上对本发明提供的queue容器的实现方法进行了详细说明,本发明还提供了一种queue容器的实现装置,以下结合图7进行详细说明:

参见图7,图7是本发明实施例queue容器的实现装置的结构示意图,如图7所示,该装置包括:

创建单元701,用于创建预设基本数据类型的数组,将所述数组作为所述queue容器的底层存储数据结构;

确定单元702,用于对于使用所述queue容器进行数据存储的任一基本数据类型,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n;n为正整数;

处理单元703,用于基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储和读取。

图7所示装置中,

所述确定单元702,确定所述任一基本数据类型对应于所述预设基本数据类型的转换长度n时,用于:

计算所述任一基本数据类型的长度与所述预设基本数据类型的长度的商;

将所述商的向上取整结果确定为所述任一基本数据类型对应于所述预设基本数据类型的转换长度n。

图7所示装置中,

所述queue容器维护有尾指针;所述尾指针指向最后存入所述queue容器维护的数组中的数据的结束位置;

所述处理单元703,基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的存储,包括:

将待存储数据转换为n个所述预设基本数据类型的数据,从所述queue容器维护的尾指针指向的所述数组中的位置开始顺序存入转换后的n个数据,并对所述queue容器的尾指针指向所述数组中的位置进行更新。

图7所示装置中,

所述queue容器维护有头指针;所述头指针指向最先存入所述queue容器维护的数组中的数据的起始位置;

所述处理单元703,基于所述转换长度n,在所述queue容器维护的所述数组中进行所述任一基本数据类型的数据的读取,包括:

从所述queue容器维护的头指针指向的所述数组中的位置开始顺序读取n个数组元素,将顺序读取的n个数据转换为所述任一基本数据类型的数据,并对所述queue容器维护的头指针指向所述数组中的位置进行更新。

图7所示装置中,还包括:重置单元704,用于:

当所述queue容器维护的所述数组中存储的数组元素的个数超出所述数组的数组长度的预设比例,且所述数组的数组长度小于预设最大数组长度时,对所述数组的数组长度进行扩充;

基于扩充后的数组长度创建所述预设基本数据类型的新的数组;

将所述queue容器维护的所述数组中的数据按照存入的先后顺序依次存入新的数组,并将所述queue容器维护的头指针指向最先存入新的数组中的数据的起始位置,将所述queue容器维护的尾指针指向最后存入新的数组中的数据的结束位置;

用新的数组取代所述queue容器维护的所述数组作为所述queue容器的底层存储数据结构,并删除所述queue容器维护的所述数组。

图7所示装置中,

所述预设基本数据类型为字节byte类型。

本发明实施例还提供了一种电子设备,如图8所示,电子设备800包括:至少一个处理器801,以及与所述至少一个处理器801通过总线相连的存储器802;所述存储器802存储有可被所述至少一个处理器801执行的一个或多个计算机程序;所述至少一个处理器801执行所述一个或多个计算机程序时实现如图2所示的方法步骤。

本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储一个或多个计算机程序,所述一个或多个计算机程序被处理器执行时实现如图2所示的方法步骤。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

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