CN101388842A - 一种存储方法和装置 - Google Patents
一种存储方法和装置 Download PDFInfo
- Publication number
- CN101388842A CN101388842A CNA2008101752081A CN200810175208A CN101388842A CN 101388842 A CN101388842 A CN 101388842A CN A2008101752081 A CNA2008101752081 A CN A2008101752081A CN 200810175208 A CN200810175208 A CN 200810175208A CN 101388842 A CN101388842 A CN 101388842A
- Authority
- CN
- China
- Prior art keywords
- node
- binary tree
- value
- list item
- resource
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L45/00—Routing or path finding of packets in data switching networks
- H04L45/74—Address processing for routing
- H04L45/745—Address table lookup; Address filtering
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Small-Scale Networks (AREA)
Abstract
本发明实施例公开了一种存储方法和装置,所述存储方法包括:获取表项在分层二叉树中的存储位置,所述分层二叉树包括第一部分二叉树和第二部分二叉树,所述第一部分二叉树节点通过指针指向所述第二部分二叉树;根据所述存储位置,将所述表项添加到所述分层二叉树中。本发明实施例通过采用带指针的分层二叉树结构存储表项内容,节省了大量的表项搬移次数,显著的提高了算法的刷新速率。
Description
技术领域
本发明涉及通信技术领域,特别涉及一种存储方法和装置。
背景技术
算法查找是路由器的一项关键技术,前期主要采用TCAM(TernaryContent Addressable Memory,三重内容可寻址存储器)来实现表项的存储和转发。
范围查找算法是一种比较成熟的通用算法技术,主要采用了三叉树的数据结构和二叉树的数据结构。
对于最长匹配的表项,每个三叉树节点包括Key值信息和掩码长度信息。通过Key值信息和掩码长度信息,可以将一个表项表示为一个范围,如:1.1.1.1/24的表项,所表示的范围为1.1.1.0-1.1.1.255这段区间,即在此区间的目的地址都将匹配到1.1.1.1/24。这样一个带掩码的路由表项就变成了由两个节点表示的范围区间了,依此类推,所有的路由表项均可以表示成为一系列范围区间,将这一系列的范围区间的节点存储至普通二叉树中。
现有技术利用FPGA(Field Programmable Gate Array,现场可编程门阵列)内部的CPU(Central Processing Unit,中央处理单元)来完成这一系列表项的添加和删除操作。但是,采用上述方法会导致存储介质的大量的读写操作,有的时候为了寻找空位需要搬移大量的表项,最严重的情况,每添加一条表项就要将前面所有的表项搬移一次。在随机的情况下,当容量达到一定程度的时候,上述方法的查找速度也会变得非常慢,使得上述方法不可能达到很高的刷新速率。
对于不同位宽的表项,现有技术需要对基地址进行严格的限制。对于64bit长的表项,现有技术依然采用32位编址。随着表项数量的增多,其基地址成倍增长。如下所示:
Page0的表项基地址为0,1,2,...
Page1的表项基地址为2,4,6,...
Page2的表项基地址为4,8,12,...
Page4的表项基地址为8,16,24,...
因此,随着表容量的不断增加,不可避免的将发生表项的大量挪动,表容量越大,搬移的次数就越多,而且是所有表项的挪动。由于此种限制所带来的表项资源管理特别复杂,当某些特定的基址被其他表项占据的时候,对于不同位宽的表项,现有技术需要对基地址进行严格限制,导致了容量的大量浪费。而且随着表项的增多其基地址成倍增长,也将导致大量的搬移操作及算法维护成本的提高。
发明内容
本发明实施例提供一种存储方法和装置,以实现节省表项搬移次数,提高算法的刷新速率。
为达到上述目的,本发明实施例一方面提供一种存储方法,包括:
获取表项在分层二叉树中的存储位置,所述分层二叉树包括第一部分二叉树和第二部分二叉树,所述第一部分二叉树节点通过指针指向所述第二部分二叉树;
根据所述存储位置,将所述表项添加到所述分层二叉树中。
另一方面,本发明实施例还提供一种存储装置,包括:
获取模块,用于获取表项在分层二叉树中的存储位置,所述分层二叉树包括第一部分二叉树和第二部分二叉树,所述第一部分二叉树节点通过指针指向所述第二部分二叉树;
添加模块,用于根据所述获取模块获取的存储位置,将所述表项添加到所述分层二叉树中。
与现有技术相比,本发明实施例具有以下优点:本发明实施例获取表项在分层二叉树中的存储位置,并根据该存储位置,将表项添加到分层二叉树中。该分层二叉树的第一部分二叉树节点通过指针指向第二部分二叉树。本发明实施例通过采用带指针的分层二叉树结构存储表项内容,节省了大量的表项搬移次数,显著的提高了算法的刷新速率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例存储方法的流程图;
图2为本发明实施例基于指针的分层二叉树结构示意图;
图3(a)、图3(b)为本发明实施例小二叉树的一种扩展示意图;
图4(a)、图4(b)为本发明实施例小二叉树的另一种扩展示意图;
图5(a)、图5(b)、图5(c)为本发明实施例小二叉树的再一种扩展示意图;
图6(a)、图6(b)为本发明实施例小二叉树的再一种扩展示意图;
图7为本发明实施例一种存储装置的结构图;
图8为本发明实施例另一种存储装置的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为本发明实施例存储方法的流程图,包括:
101,获取表项在分层二叉树中的存储位置,该分层二叉树包括第一部分二叉树和第二部分二叉树,第一部分二叉树节点通过指针指向第二部分二叉树。
102,根据存储位置,将表项添加到分层二叉树中。
其中,将表项添加到分层二叉树中具体可以为:
在向分层二叉树中添加第一条表项时,为第一条表项分配一个第一部分二叉树节点和一个第二部分二叉树,分配的第一部分二叉树节点通过指针指向分配的第二部分二叉树;
在继续向分层二叉树中添加表项时,通过指针将需要添加的表项添加到对应的第二部分二叉树中。如果对应的第二部分二叉树资源已满,则为需要添加的表项重新分配第二部分二叉树。
当资源已满的第二部分二叉树对应的第一部分二叉树节点为第一部分二叉树的边缘节点时,如果该边缘节点旁边有空余节点,则分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将该空余节点的值设为资源已满的第二部分二叉树的值的中间值,该边缘节点和空余节点通过指针分别指向新分配的两个第二部分二叉树;
当上述边缘节点旁边没有空余节点时,在第一部分二叉树中查找两个连续的第一部分二叉树节点,并分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的第二部分二叉树中,并将新查找到的两个连续的第一部分二叉树节点的值分别设为边缘节点的值和资源已满的第二部分二叉树的值的中间值,新查找到的两个连续的第一部分二叉树节点通过指针分别指向新分配的两个第二部分二叉树。
当资源已满的第二部分二叉树对应的第一部分二叉树节点为第一部分二叉树的中间节点时,如果该中间节点旁边有空余节点,则将该中间节点所在表中空余节点和中间节点之间的节点向该空余节点依次移一位,并将该中间节点所在表中空余节点和中间节点之间的节点的指针对应地依次进行移位,使得该中间节点连续的下一节点空余,分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将该中间节点连续的下一节点的值设为资源已满的第二部分二叉树的值的中间值,该中间节点、该中间节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树;
当上述中间节点旁边没有空余节点时,查找一片连续的第一部分二叉树节点区域,将该中间节点所在表的所有节点对应地搬移到该连续的第一部分二叉树节点区域,并将该中间节点所在表的所有节点的指针对应地依次进行移位,使得该中间节点搬移后的对应节点,该对应节点连续的下一节点空余,分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将对应节点和该对应节点连续的下一节点的值分别设为该中间节点的值和资源已满的第二部分二叉树的值的中间值,该对应节点和该对应节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树。
上述存储方法,获取表项在分层二叉树中的存储位置,并根据该存储位置,将表项添加到分层二叉树中。该分层二叉树的第一部分二叉树节点通过指针指向第二部分二叉树。本发明实施例通过采用带指针的分层二叉树结构存储表项内容,节省了大量的表项搬移次数,显著的提高了算法的刷新速率。
本发明实施例提出基于指针的分层二叉树结构,如图2所示,分层二叉树是指将一棵完整的二叉树,在某一层进行切割,分割后的第一部分也是一棵完整的二叉树,第二部分则是由多个小的二叉树组成,第一部分二叉树节点和第二部分小二叉树通过指针连接。
分层二叉树的第一部分和第二部分都是普通的二叉树,表项从第一部分到第二部分的查找是通过指针来完成的。第一部分二叉树节点可以通过指针指向第二部分任意的小二叉树。由于指针的存在,这样第二部分的二叉树将不再固定的连接到第一部分二叉树节点,而是由指针来决定挂在哪个二叉树节点下面。由于在内存中保留了完整的分层二叉树的结构,因此分层二叉树的添加、删除、搬移和寻找空位的操作都是由CPU来完成的,因此减少了大量读取操作时间。而且采用CPU来操作非常有利于后续的算法扩展。
在资源管理方面,本发明实施例在最开始的时候不需要固定各个表项的区域。所有表项都是从零开始增长的,当某个表的表项数量为零的时候,它所占用的资源就为零。添加第一条表项时,为第一条表项分配一个第一部分二叉树节点和一个第二部分小二叉树,第一部分二叉树节点通过指针指向对应的小二叉树。
在继续添加表项的时候,可以通过指针将表项添加到对应的小二叉树。如果小二叉树有空间,则只需挪动小二叉树内部的节点,将表项添加到对应的小二叉树节点上,如果小二叉树的资源不够则需要重新分配新的小二叉树。如果资源已满的小二叉树对应的第一部分二叉树节点为第一部分二叉树的边缘节点,则可以采用以下几种方式:
(1)如果该边缘节点旁边还有空余节点时,可以在该二叉树节点旁边进行扩展。先分配两棵新的小二叉树,将资源已满的小二叉树的值分成两半添加到两棵新的小二叉树中,并将空余节点的值设为资源已满的小二叉树的值的中间值。然后将边缘节点和该边缘节点旁边的二叉树节点通过指针分别指向新分配的小二叉树。
具体地,请参见图3(a),第一部分二叉树节点3指向小二叉树1,小二叉树1的资源已用尽,需要重新分配新的小二叉树。继续参见图3(b),第一部分二叉树节点3旁边有空余节点4,因此先分配两棵新的小二叉树2和小二叉树3,将小二叉树1的值分成两半添加到小二叉树2和小二叉树3中,并将空余节点4的值设为小二叉树1的值的中间值,然后第一部分二叉树节点3通过指针指向小二叉树2,第一部分二叉树节点4通过指针指向小二叉树3。
当两个表项的容量减少到预设的值时,可以进行表项的合并操作,删除表项的对应节点。删除节点的操作与添加节点的操作互为逆操作,以图3(b)为例,当小二叉树2和小二叉树3对应表项的容量减少到预设的值时,可以将小二叉树2和小二叉树3的值合并,存储到小二叉树1中,删除第一部分二叉树节点4的指针,第一部分二叉树节点3通过指针指向小二叉树1。最后的存储结果如图3(a)所示。
本发明实施例在将节点删除后,回收删除的节点的信息,以便资源管理。在后续查找空余节点时,可以根据资源管理进行查找。
(2)如果该边缘节点旁边没有空余的二叉树节点,则可以在第一部分二叉树中寻找两个连续的二叉树节点,同时也要分配两棵新的小二叉树。将资源已满的小二叉树的值分成两半添加到两棵新的小二叉树中,并将新查找到的两个连续的第一部分二叉树节点的值分别设为边缘节点的值和资源已满的小二叉树的值的中间值。然后将寻找到的两个连续的二叉树节点通过指针分别指向新分配的小二叉树。
具体地,请参见图4(a),第一部分二叉树节点3指向小二叉树1,小二叉树1的资源已用尽,需要重新分配新的小二叉树。继续参见图4(b),第一部分的二叉树节点3旁边没有空余节点,因此在第一部分二叉树中寻找两个连续的二叉树节点6和7,同时分配两棵新的小二叉树2和小二叉树4,将小二叉树1的值分成两半添加到小二叉树2和小二叉树4中,并将二叉树节点6和7的值分别设为第一部分二叉树节点3的值和小二叉树1的值的中间值,然后第一部分二叉树节点6通过指针指向小二叉树2,第一部分二叉树节点7通过指针指向小二叉树4。
随着表项的继续增加,分配的二叉树资源也将越来越多。由于要保证查找的连续性,对于同一个表,第一部分二叉树节点的序号最好是连续的。而第二部分小二叉树的编号则没有这个要求。在表项添加过程中,当第一部分二叉树的中间节点对应的小二叉树表项资源已满,需要拆分时,可以采用以下几种方式:
(1)如果该中间节点旁边有空闲节点,则可以将该中间节点和空闲节点之间的节点依次向空闲节点的方向挪一个位置,对应的指针也跟着移动,使中间节点连续的下一节点空余。然后,分配两棵新的小二叉树,将资源已满的小二叉树的值分成两部分存储到两棵新的小二叉树中,并将该中间节点连续的下一节点的值设为资源已满的小二叉树的值的中间值,该中间节点、该中间节点连续的下一节点通过指针分别指向新分配的两棵小二叉树。最后该中间节点、该中间节点连续的下一节点通过指针分别指向新分配的两棵小二叉树。
具体地,请参见图5(a),第一部分二叉树节点5指向小二叉树34,小二叉树34的资源已满,第一部分二叉树节点8空闲,则继续参见图5(b),将第一部分二叉树节点8通过指针指向小二叉树28,将第一部分二叉树节点7通过指针指向小二叉树2,将第一部分二叉树节点6通过指针也指向小二叉树2,使第一部分二叉树节点6空余。请一并参考图5(c),分配两棵新的小二叉树4和小二叉树19,将小二叉树34的值分成两部分,分别存储到新分配的小二叉树4和小二叉树19中,将第一部分二叉树节点6的值设为小二叉树34的值的中间值。第一部分二叉树节点5通过指针指向小二叉树19,第一部分二叉树节点6通过指针指向小二叉树4。
从图5可以看出,当一个小二叉树不能再存放表项的时候,可以将第一部分二叉树节点进行依次移位,并将资源已满的小二叉树的值分别存储到两个新的小二叉树中,所用的写操作非常少,这也是采用分层二叉树结构可以省去绝大部分搬移操作的原因。
同样地,当两个表项的容量减少到预设的值时,可以进行表项的合并操作,删除表项的对应节点。删除节点的操作与添加节点的操作互为逆操作,以图5(c)为例,当小二叉树4和小二叉树19对应表项的容量减少到预设的值时,可以将小二叉树4和小二叉树19的值合并,存储到小二叉树34中,删除第一部分二叉树节点8的指针,将第一部分二叉树节点7通过指针指向小二叉树28,将第一部分二叉树节点6通过指针指向小二叉树2,并将第一部分二叉树节点5指向小二叉树34。最后的存储结果如图5(a)所示。
本发明实施例在将节点删除后,回收删除的节点的信息,以便资源管理。在后续查找空余节点时,可以根据资源管理进行查找。
(2)如果中间节点旁边没有空余节点,则可以寻找一片连续的二叉树区域,将该中间节点及其旁边的节点搬移到该连续的二叉树区域中,并将该中间节点所在表的所有节点的指针对应地依次进行移位,使得该中间节点搬移后的对应节点,该对应节点连续的下一节点空余,分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个小二叉树中,并将该对应节点和该对应节点连续的下一节点的值分别设为该中间节点的值和资源已满的小二叉树的值的中间值,该对应节点和该对应节点连续的下一节点通过指针分别指向新分配的两个小二叉树。
具体地,请参见图6(a),第一部分二叉树节点5指向小二叉树34,小二叉树34的资源已满,并且第一部分二叉树节点5旁边没有空闲节点。请一并参考图6(b),在第一部分二叉树节点1、2、3、4、5、6、7旁边寻找一片连续的二叉树节点9、10、11、12、13、14、15。第一部分二叉树节点5对应地搬移到连续的二叉树节点中的第一部分二叉树节点12和13,分配两棵新的小二叉树4和小二叉树19,将小二叉树34的值分成两部分存储到小二叉树4和小二叉树19中,并将第一部分二叉树节点12和13的值分别设为第一部分二叉树节点5的值和小二叉树34的值的中间值。将第一部分二叉树节点12通过指针指向小二叉树19,将第一部分二叉树节点13通过指针指向小二叉树4。
本发明实施例在具体实现时,随着表项数量的变化,更改表项对应的表的边界值。
本发明实施例在开始时并没有为表项分配好固定的资源,而是随着表项数量的变化,动态地申请资源,并将该资源分配给第一部分二叉树和第二部分二叉树。从而实现了资源的动态共享,在某一个应用场景下,某个表项的容量比较大的时候,可以为该表项分配足够的资源。因此,资源的动态共享增加了资源分配的灵活性,可以在不进行单板重启的情况下满足所有场景的应用。
本发明实施例中,不同位宽的表项分别采用不同的编号方式,并且不同位宽的表项的编号对应不同的二叉树节点。由于不同位宽的表项所占用的节点个数不同,而且,地址的编码也各不相同。例如:位宽为64bit的表项,一个节点就要占据2个32bit的节点。因此,采用位宽为32bit的表项的排序方式来管理位宽为64bit的表项,将会很不方便。而采用独立编号,进行查表时,位宽为32bit和位宽为64bit的表项分别采用不同的编号方式,相互独立,但是位宽为32bit和位宽为64bit的表项在编号时不能有重合的二叉树节点,也就是说位宽为32bit和位宽为64bit的表项编号存在一个分界线。此分界线是动态的,当位宽为32bit的表项占用的资源不足时,可以将此分界线向位宽为64bit的表项的方向移动,相反,当位宽为64bit的表项占用资源不够时,此分界线需要向位宽为32bit的表项的方向移动。
不同位宽的表项其基地址可以自由改变。
对于相同位宽的表项,本发明实施例采用基于页表和块表的资源管理方式,实现了多VPN资源的管理。基于页表的资源管理方式按照2的指数幂进行资源分配、聚合和回收,其优点是管理简单,搬移量小,并且可以通过表项压缩来减小资源的浪费。本发明实施例在页管理的基础上引入了一个块表,大于一定数量的页表进入块表,按照+1或-1进行分配,对于容量较小的VPN使用页表进行页管理,容量较大的VPN使用块表进行块管理。
本发明实施例通过采用带指针的分层二叉树结构存储表项内容,节省了大量的表项搬移次数,显著的提高了算法的刷新速率。灵活的表项动态管理、不同位宽的表项共享给运营商提供了更多的配置方面的选择性,无须对单板进行重启操作。
如图7所示,为本发明实施例一种存储装置的结构图,包括:
获取模块71,用于获取表项在分层二叉树中的存储位置,该分层二叉树包括第一部分二叉树和第二部分二叉树,其中,第一部分二叉树节点通过指针指向第二部分二叉树;
添加模块72,用于根据获取模块71获取的存储位置,将该表项添加到分层二叉树中。
如图8所示,添加模块72可以包括:
第一添加子模块721,用于在向分层二叉树中添加第一条表项时,为该第一条表项分配一个第一部分二叉树节点和一个第二部分二叉树,分配的第一部分二叉树节点通过指针指向分配的第二部分二叉树;
第二添加子模块722,用于在继续向分层二叉树中添加表项时,通过指针将需要添加的表项添加到对应的第二部分二叉树中。
该存储装置还可以包括:
分配模块73,用于在对应的第二部分二叉树资源已满时,为需要添加的表项重新分配第二部分二叉树。
其中,分配模块73可以包括:
第一分配子模块731,用于当资源已满的第二部分二叉树对应的第一部分二叉树节点为第一部分二叉树的边缘节点时,如果该边缘节点旁边有空余节点,则分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将该空余节点的值设为资源已满的第二部分二叉树的值的中间值,该边缘节点和该空余节点通过指针分别指向新分配的两个第二部分二叉树;
第二分配子模块732,用于当上述边缘节点旁边没有空余节点时,在第一部分二叉树中查找两个连续的第一部分二叉树节点,并分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的第二部分二叉树中,并将新查找到的两个连续的第一部分二叉树节点的值分别设为边缘节点的值和资源已满的第二部分二叉树的值的中间值,新查找到的两个连续的第一部分二叉树节点通过指针分别指向新分配的两个第二部分二叉树。
分配模块73可以包括:
第三分配子模块733,用于当资源已满的第二部分二叉树对应的第一部分二叉树节点为第一部分二叉树的中间节点时,如果该中间节点旁边有空余节点,将该中间节点所在表中该空余节点和中间节点之间的节点向空余节点依次移一位,并将该中间节点所在表中该空余节点和该中间节点之间的节点的指针对应地依次进行移位,使得中间节点连续的下一节点空余,分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将该中间节点连续的下一节点的值设为所述资源已满的第二部分二叉树的值的中间值,该中间节点、该中间节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树;
第四分配子模块734,用于当中间节点旁边没有空余节点时,查找一片连续的第一部分二叉树节点区域,将中间节点所在表的所有节点对应地搬移到该连续的第一部分二叉树节点区域,并将该中间节点所在表的所有节点的指针对应地依次进行移位,使得该中间节点搬移后的对应节点,该对应节点连续的下一节点空余,分配两个新的第二部分二叉树,将资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将该对应节点和该对应节点连续的下一节点的值分别设为中间节点的值和资源已满的第二部分二叉树的值的中间值,该对应节点和该对应节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树。
上述存储装置,添加模块72将表项添加到分层二叉树中,存储模块72再将分层二叉树的表项存储到存储介质中,该分层二叉树的第一部分二叉树节点通过指针指向第二部分二叉树。本发明实施例通过采用带指针的分层二叉树结构存储表项内容,节省了大量的表项搬移次数,显著的提高了算法的刷新速率。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。
Claims (14)
1、一种存储方法,其特征在于,包括:
获取表项在分层二叉树中的存储位置,所述分层二叉树包括第一部分二叉树和第二部分二叉树,所述第一部分二叉树节点通过指针指向所述第二部分二叉树;
根据所述存储位置,将所述表项添加到所述分层二叉树中。
2、如权利要求1所述的方法,其特征在于,所述将所述表项添加到所述分层二叉树中具体包括:
在向所述分层二叉树中添加第一条表项时,为所述第一条表项分配一个第一部分二叉树节点和一个第二部分二叉树,分配的第一部分二叉树节点通过指针指向分配的第二部分二叉树;
在继续向所述分层二叉树中添加表项时,通过指针将需要添加的表项添加到对应的第二部分二叉树中。
3、如权利要求2所述的方法,其特征在于,还包括:
如果所述对应的第二部分二叉树资源已满,则为需要添加的表项重新分配第二部分二叉树。
4、如权利要求3所述的方法,其特征在于,资源已满的第二部分二叉树对应的第一部分二叉树节点为所述第一部分二叉树的边缘节点,所述为需要添加的表项重新分配第二部分二叉树具体包括:
当所述边缘节点旁边有空余节点时,分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述空余节点的值设为所述资源已满的第二部分二叉树的值的中间值,所述边缘节点和所述空余节点通过指针分别指向新分配的两个第二部分二叉树;
当所述边缘节点旁边没有空余节点时,在第一部分二叉树中查找两个连续的第一部分二叉树节点,并分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的第二部分二叉树中,并将所述新查找到的两个连续的第一部分二叉树节点的值分别设为所述边缘节点的值和所述资源已满的第二部分二叉树的值的中间值,所述新查找到的两个连续的第一部分二叉树节点通过指针分别指向新分配的两个第二部分二叉树。
5、如权利要求3所述的方法,其特征在于,资源已满的第二部分二叉树对应的第一部分二叉树节点为所述第一部分二叉树的中间节点,所述为需要添加的表项重新分配第二部分二叉树具体包括:
当所述中间节点旁边有空余节点时,将所述中间节点所在表中所述空余节点和所述中间节点之间的节点向所述空余节点依次移一位,并将所述中间节点所在表中所述空余节点和所述中间节点之间的节点的指针对应地依次进行移位,使得所述中间节点连续的下一节点空余,分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述中间节点连续的下一节点的值设为所述资源已满的第二部分二叉树的值的中间值,所述中间节点、所述中间节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树;
当所述中间节点旁边没有空余节点时,查找一片连续的第一部分二叉树节点区域,将所述中间节点所在表的所有节点对应地搬移到所述连续的第一部分二叉树节点区域,并将所述中间节点所在表的所有节点的指针对应地依次进行移位,使得所述中间节点搬移后的对应节点,所述对应节点连续的下一节点空余,分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述对应节点和所述对应节点连续的下一节点的值分别设为所述中间节点的值和所述资源已满的第二部分二叉树的值的中间值,所述对应节点和所述对应节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树。
6、如权利要求1所述的方法,其特征在于,还包括:随着表项数量的变化,动态地申请资源,并将所述资源分配给所述第一部分二叉树和所述第二部分二叉树。
7、如权利要求1所述的方法,其特征在于,还包括:随着表项数量的变化,更改所述表项对应的表的边界值。
8、如权利要求1所述的方法,其特征在于,还包括:
不同位宽的表项分别采用不同的编号方式,并且所述不同位宽的表项的编号对应不同的二叉树节点。
9、如权利要求1所述的方法,其特征在于,还包括:对于相同位宽的表项,采用基于页表和块表的资源管理方式,对于容量较小的VPN使用页表进行页管理,容量较大的VPN使用块表进行块管理。
10、一种存储装置,其特征在于,包括:
获取模块,用于获取表项在分层二叉树中的存储位置,所述分层二叉树包括第一部分二叉树和第二部分二叉树,所述第一部分二叉树节点通过指针指向所述第二部分二叉树;
添加模块,用于根据所述获取模块获取的存储位置,将所述表项添加到所述分层二叉树中。
11、如权利要求10所述的装置,其特征在于,所述添加模块包括:
第一添加子模块,用于在向所述分层二叉树中添加第一条表项时,为所述第一条表项分配一个第一部分二叉树节点和一个第二部分二叉树,分配的第一部分二叉树节点通过指针指向分配的第二部分二叉树;
第二添加子模块,用于在继续向所述分层二叉树中添加表项时,通过指针将需要添加的表项添加到对应的第二部分二叉树中。
12、如权利要求10所述的装置,其特征在于,还包括:
分配模块,用于在对应的第二部分二叉树资源已满时,为需要添加的表项重新分配第二部分二叉树。
13、如权利要求12所述的装置,其特征在于,所述分配模块包括:
第一分配子模块,用于当资源已满的第二部分二叉树对应的第一部分二叉树节点为第一部分二叉树的边缘节点时,如果所述边缘节点旁边有空余节点,则分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述空余节点的值设为所述资源已满的第二部分二叉树的值的中间值,所述边缘节点和所述空余节点通过指针分别指向新分配的两个第二部分二叉树;
第二分配子模块,用于当所述边缘节点旁边没有空余节点时,在第一部分二叉树中查找两个连续的第一部分二叉树节点,并分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的第二部分二叉树中,并将所述新查找到的两个连续的第一部分二叉树节点的值分别设为所述边缘节点的值和所述资源已满的第二部分二叉树的值的中间值,所述新查找到的两个连续的第一部分二叉树节点通过指针分别指向新分配的两个第二部分二叉树。
14、如权利要求11所述的装置,其特征在于,所述分配模块包括:
第三分配子模块,用于当资源已满的第二部分二叉树对应的第一部分二叉树节点为所述第一部分二叉树的中间节点时,如果所述中间节点旁边有空余节点,将所述中间节点所在表中所述空余节点和所述中间节点之间的节点向所述空余节点依次移一位,并将所述中间节点所在表中所述空余节点和所述中间节点之间的节点的指针对应地依次进行移位,使得所述中间节点连续的下一节点空余,分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述中间节点连续的下一节点的值设为所述资源已满的第二部分二叉树的值的中间值,所述中间节点、所述中间节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树;
第四分配子模块,用于当所述中间节点旁边没有空余节点时,查找一片连续的第一部分二叉树节点区域,将所述中间节点所在表的所有节点对应地搬移到所述连续的第一部分二叉树节点区域,并将所述中间节点所在表的所有节点的指针对应地依次进行移位,使得所述中间节点搬移后的对应节点,所述对应节点连续的下一节点空余,分配两个新的第二部分二叉树,将所述资源已满的第二部分二叉树的值分为两部分添加到新分配的两个第二部分二叉树中,并将所述对应节点和所述对应节点连续的下一节点的值分别设为所述中间节点的值和所述资源已满的第二部分二叉树的值的中间值,所述对应节点和所述对应节点连续的下一节点通过指针分别指向新分配的两个第二部分二叉树。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101752081A CN101388842B (zh) | 2008-10-30 | 2008-10-30 | 一种存储方法和装置 |
PCT/CN2009/074454 WO2010048856A1 (zh) | 2008-10-30 | 2009-10-14 | 一种存储方法和装置 |
EP09823048.5A EP2352258B1 (en) | 2008-10-30 | 2009-10-14 | Storage method and apparatus |
US13/097,925 US8341187B2 (en) | 2008-10-30 | 2011-04-29 | Method and device for storage |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101752081A CN101388842B (zh) | 2008-10-30 | 2008-10-30 | 一种存储方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101388842A true CN101388842A (zh) | 2009-03-18 |
CN101388842B CN101388842B (zh) | 2012-04-04 |
Family
ID=40478033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101752081A Active CN101388842B (zh) | 2008-10-30 | 2008-10-30 | 一种存储方法和装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8341187B2 (zh) |
EP (1) | EP2352258B1 (zh) |
CN (1) | CN101388842B (zh) |
WO (1) | WO2010048856A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010048856A1 (zh) * | 2008-10-30 | 2010-05-06 | 华为技术有限公司 | 一种存储方法和装置 |
CN102143034A (zh) * | 2010-06-04 | 2011-08-03 | 华为技术有限公司 | 路由表项的处理方法和装置 |
WO2011124030A1 (zh) * | 2010-04-08 | 2011-10-13 | 华为技术有限公司 | 路由表项的存储方法和装置 |
CN101616090B (zh) * | 2009-07-28 | 2012-08-29 | 华为技术有限公司 | 一种划分树节点资源方法及装置 |
CN102662855A (zh) * | 2012-04-17 | 2012-09-12 | 华为技术有限公司 | 一种二叉树的存储方法、系统 |
CN102904812A (zh) * | 2012-09-29 | 2013-01-30 | 华为技术有限公司 | 路由表项的存储方法、查找方法、装置及系统 |
CN105159915A (zh) * | 2015-07-16 | 2015-12-16 | 中国科学院计算技术研究所 | 可动态适应的lsm树合并方法及系统 |
CN105512320A (zh) * | 2015-12-18 | 2016-04-20 | 北京金山安全软件有限公司 | 一种用户排名获得方法、装置及服务器 |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9058347B2 (en) * | 2012-08-30 | 2015-06-16 | Facebook, Inc. | Prospective search of objects using K-D forest |
US9053191B2 (en) | 2012-08-30 | 2015-06-09 | Facebook, Inc. | Retroactive search of objects using k-d tree |
CN104268170B (zh) * | 2014-09-12 | 2017-05-17 | 电子科技大学 | 一种qpf字库组织方法 |
US9712455B1 (en) * | 2014-11-13 | 2017-07-18 | Cisco Technology, Inc. | Determining availability of networking resources prior to migration of a server or domain |
CN111049746B (zh) * | 2018-10-12 | 2022-04-22 | 华为技术有限公司 | 一种路由表项生成方法、字典树生成方法和装置 |
CN114901823A (zh) | 2019-12-26 | 2022-08-12 | 日本新药株式会社 | 诱导外显子50的跳读的反义核酸 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5557786A (en) * | 1994-01-24 | 1996-09-17 | Advanced Computer Applications, Inc. | Threaded, height-balanced binary tree data structure |
EP0977128A1 (en) * | 1998-07-28 | 2000-02-02 | Matsushita Electric Industrial Co., Ltd. | Method and system for storage and retrieval of multimedia objects by decomposing a tree-structure into a directed graph |
WO2001014948A2 (en) * | 1999-08-19 | 2001-03-01 | Matrix Device Limited | Recursive dynamic access to a data model having a hierarchical tree structure |
US6567815B1 (en) * | 2000-08-01 | 2003-05-20 | International Business Machines Corporation | Technique of clustering and compaction of binary trees |
US6766317B2 (en) | 2001-07-18 | 2004-07-20 | Alliance Semiconductor | Range check cell and a method for the use thereof |
US6941314B2 (en) * | 2002-04-15 | 2005-09-06 | Lsi Logic Corporation | User selectable editing protocol for fast flexible search engine |
US7231383B2 (en) * | 2002-05-01 | 2007-06-12 | Lsi Corporation | Search engine for large-width data |
JP4091604B2 (ja) * | 2002-10-03 | 2008-05-28 | 株式会社インフォーエス | ビットストリングの照合方法および装置 |
CN100428226C (zh) * | 2003-12-27 | 2008-10-22 | 海信集团有限公司 | 实现类内存数据库存取和检索的方法 |
EP1800227A2 (en) * | 2004-10-04 | 2007-06-27 | Clearpace Software Limited | Method and system for implementing an enhanced database |
JP4556761B2 (ja) * | 2005-05-06 | 2010-10-06 | 株式会社日立製作所 | パケット転送装置 |
CN100468402C (zh) * | 2005-10-26 | 2009-03-11 | 腾讯科技(深圳)有限公司 | 一种数据存储及查询方法 |
CN101141389B (zh) * | 2007-09-29 | 2010-06-16 | 华为技术有限公司 | 增强多位Trie树查找方法和装置 |
US7788305B2 (en) * | 2007-11-13 | 2010-08-31 | Oracle International Corporation | Hierarchy nodes derived based on parent/child foreign key and/or range values on parent node |
CN101388842B (zh) * | 2008-10-30 | 2012-04-04 | 华为技术有限公司 | 一种存储方法和装置 |
-
2008
- 2008-10-30 CN CN2008101752081A patent/CN101388842B/zh active Active
-
2009
- 2009-10-14 EP EP09823048.5A patent/EP2352258B1/en active Active
- 2009-10-14 WO PCT/CN2009/074454 patent/WO2010048856A1/zh active Application Filing
-
2011
- 2011-04-29 US US13/097,925 patent/US8341187B2/en active Active
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010048856A1 (zh) * | 2008-10-30 | 2010-05-06 | 华为技术有限公司 | 一种存储方法和装置 |
US8341187B2 (en) | 2008-10-30 | 2012-12-25 | Huawei Technologies Co., Ltd. | Method and device for storage |
CN101616090B (zh) * | 2009-07-28 | 2012-08-29 | 华为技术有限公司 | 一种划分树节点资源方法及装置 |
EP2544414A4 (en) * | 2010-04-08 | 2013-01-09 | Huawei Tech Co Ltd | METHOD AND DEVICE FOR STORING ROUTING TABLE INPUT |
EP2544414A1 (en) * | 2010-04-08 | 2013-01-09 | Huawei Technologies Co., Ltd. | Method and device for storing routing table entry |
CN102405623A (zh) * | 2010-04-08 | 2012-04-04 | 华为技术有限公司 | 路由表项的存储方法和装置 |
WO2011124030A1 (zh) * | 2010-04-08 | 2011-10-13 | 华为技术有限公司 | 路由表项的存储方法和装置 |
CN102143034B (zh) * | 2010-06-04 | 2013-11-06 | 华为技术有限公司 | 路由表项的处理方法和装置 |
CN102143034A (zh) * | 2010-06-04 | 2011-08-03 | 华为技术有限公司 | 路由表项的处理方法和装置 |
CN102662855A (zh) * | 2012-04-17 | 2012-09-12 | 华为技术有限公司 | 一种二叉树的存储方法、系统 |
CN102662855B (zh) * | 2012-04-17 | 2015-02-25 | 华为技术有限公司 | 一种二叉树的存储方法、系统 |
US9075533B2 (en) | 2012-04-17 | 2015-07-07 | Huawei Technologies Co., Ltd. | Binary tree storage method and system |
CN102904812A (zh) * | 2012-09-29 | 2013-01-30 | 华为技术有限公司 | 路由表项的存储方法、查找方法、装置及系统 |
CN102904812B (zh) * | 2012-09-29 | 2015-07-29 | 华为技术有限公司 | 路由表项的存储方法、查找方法、装置及系统 |
CN105159915A (zh) * | 2015-07-16 | 2015-12-16 | 中国科学院计算技术研究所 | 可动态适应的lsm树合并方法及系统 |
CN105159915B (zh) * | 2015-07-16 | 2018-07-10 | 中国科学院计算技术研究所 | 可动态适应的lsm树合并方法及系统 |
CN105512320A (zh) * | 2015-12-18 | 2016-04-20 | 北京金山安全软件有限公司 | 一种用户排名获得方法、装置及服务器 |
CN105512320B (zh) * | 2015-12-18 | 2019-03-01 | 北京金山安全软件有限公司 | 一种用户排名获得方法、装置及服务器 |
Also Published As
Publication number | Publication date |
---|---|
CN101388842B (zh) | 2012-04-04 |
WO2010048856A1 (zh) | 2010-05-06 |
US8341187B2 (en) | 2012-12-25 |
US20110202571A1 (en) | 2011-08-18 |
EP2352258A4 (en) | 2014-02-19 |
EP2352258B1 (en) | 2016-01-13 |
EP2352258A1 (en) | 2011-08-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101388842B (zh) | 一种存储方法和装置 | |
US11468027B2 (en) | Method and apparatus for providing efficient indexing and computer program included in computer readable medium therefor | |
US9672235B2 (en) | Method and system for dynamically partitioning very large database indices on write-once tables | |
CN100458779C (zh) | 扩展索引的方法 | |
US5333318A (en) | Creating and searching a quad linked list in a trunked communication system | |
CN101667958B (zh) | 选择哈希函数的方法、存储及查找路由表的方法及装置 | |
CN100566281C (zh) | 虚拟私用网路由查找的方法和装置 | |
KR20170123336A (ko) | 파일 조작 방법 및 장치 | |
KR19990070838A (ko) | 데이터 베이스 관리 시스템과 정보 검색의 밀결합을 위하여 서브 인덱스와 대용량 객체를 이용한 역 인덱스 저장 구조 | |
JPH0432420B2 (zh) | ||
CN103914483A (zh) | 文件存储方法、装置及文件读取方法、装置 | |
CN103020054A (zh) | 模糊查询方法及系统 | |
CN101826109A (zh) | 一种大容量文件分割方法、装置及系统 | |
CN104598652B (zh) | 一种数据库查询方法及装置 | |
CN104038423A (zh) | 一种Open flow流表刷新方法及路由设备 | |
CN104268158A (zh) | 一种结构化数据分布式索引及检索方法 | |
CN103631838A (zh) | 用于以存储高效的方式存储表格数据的方法和系统 | |
CN100433009C (zh) | 静态范围匹配表的管理维护方法 | |
US20190073195A1 (en) | Computing device sort function | |
CN102904812B (zh) | 路由表项的存储方法、查找方法、装置及系统 | |
CN104090942A (zh) | 应用于网络处理器中的Trie搜索方法及装置 | |
JP2015162042A (ja) | インデックス管理装置 | |
KR100878142B1 (ko) | 플래시 메모리 상에서의 효율적인 동작을 위한 수정된b-트리 인덱스 구성 방법 | |
CN1235169C (zh) | 一种嵌入式系统的数据存放及其查找方法 | |
CN100361088C (zh) | 一种实现设备测试的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |