CN115168296A - 一种网元反算数据拆分的方法和装置 - Google Patents
一种网元反算数据拆分的方法和装置 Download PDFInfo
- Publication number
- CN115168296A CN115168296A CN202210894777.1A CN202210894777A CN115168296A CN 115168296 A CN115168296 A CN 115168296A CN 202210894777 A CN202210894777 A CN 202210894777A CN 115168296 A CN115168296 A CN 115168296A
- Authority
- CN
- China
- Prior art keywords
- node
- keyword
- key
- nodes
- ancestor
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/16—File or folder operations, e.g. details of user interfaces specifically adapted to file systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及通信网络管理领域,特别是涉及一种网元反算数据拆分的方法和装置。主要包括:遍历网元反算配置文件对应的树结构,树结构的每个节点对应配置文件中的一个数据项;根据预设关键字标记每个节点的节点类型;根据节点类型,以及每个节点与关键字节点的关系,将树结构拆分为至少一个关键字子树,每个关键字子树中有且仅有一个关键字节点,每个关键字子树包含关键字节点在配置文件对应的树结构中所有的祖先和后代,及符合预设特征的关键字兄弟节点;根据关键字子树中包含的节点,生成相应预设关键字的数据条目。本发明可以在保证每个数据条目信息完整、依赖关系完整、不丢失内容的前提下,使得拆分后的冗余数据更少。
Description
【技术领域】
本发明涉及通信网络管理领域,特别是涉及一种网元反算数据拆分的方法和装置。
【背景技术】
在网管对设备的管理过程中,除了网管对设备做配置之外,还需要读取设备上的配置进行分析和管理,网管获取设备配置的过程通过网元反算实现。为了保持网管和设备配置数据的一致性,需要全量读取设备上的配置,以便和网管配置进行比对。对于采用YANG模型的设备,设备的全量配置通过单个配置文件加密并压缩后上报给网管。网管需从设备的全量配置中提取需要比较的配置数据,再将设备配置数据和网管配置数据进行比较后,将选定的设备配置数据同步到网管。
现有的配置数据提取方式是将单个配置文件按照配置块类型拆分到不同的配置文件,每个配置块再分别转换成网管的Protocol Buffers(简写为PB)数据模型。例如,将配置文件中所有与接口相关的数据都拆分到一个接口配置块中,再转换成一个大的PB数据结构。这种处理方式拆分粒度较粗,在很多场景中,拆分后接口配置块还会有多达数百个接口的数据。这些数据生成一个PB数据结构,数据量较大,由于PB数据结构要在内存中整体生成,导致占用内存较多。同时,大的PB数据结构会导致对数据的查找和统计不便,如要查找某个接口数据或统计某种接口个数,都需要遍历整个PB数据结构,效率较低。
鉴于此,如何克服现有技术所存在的缺陷,解决现有网元反算方法导致的处理不便,是本技术领域待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了现有网元反算方法由于拆分粒度较粗导致的内存占用大和处理效率低的问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种网元反算数据拆分的方法,具体为:遍历网元反算配置文件对应的树结构,所述树结构的每个节点对应配置文件中的一个数据项;根据预设关键字标记每个节点的节点类型,所述每个预设关键字在业务逻辑中具有唯一性,所述节点类型包括关键字节点、关键字祖先节点、关键字后代节点和关键字兄弟节点;根据节点类型,以及每个节点与关键字节点的关系,将树结构拆分为至少一个关键字子树,每个关键字子树中有且仅有一个关键字节点,每个关键字子树包含关键字节点在配置文件对应的树结构中所有的祖先和后代,及符合预设特征的关键字兄弟节点;根据关键字子树中包含的节点,生成相应预设关键字的数据条目。
优选的,根据预设关键字标记每个节点的节点类型,具体包括:当遍历到的节点的名称与预设关键字相匹配时,标记该节点为关键字节点;对于每个关键字节点,遍历其所有祖先节点,将遍历到的祖先节点标记为关键字祖先节点。
优选的,将遍历到的祖先节点标记为关键字祖先节点,还包括:当遍历到的祖先节点对应与该关键字节点不同的预设关键字时,关键字祖先节点对应的预设关键字不再作为预设关键字使用。
优选的,将树结构拆分为至少一个关键字子树,具体包括:将关键字节点保留在对应的关键字子树中,每个关键字节点对应唯一一个关键字子树;将关键字节点的后代节点按照配置文件的树结构的层次关系加入对应的关键字子树中;将关键字祖先节点按照配置文件的树结构的层次关系加入对应的关键字子树中;将关键字兄弟节点按照配置文件的树结构的层次加入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中。
优选的,关键字祖先节点按照配置文件的树结构的层次关系加入对应的关键字子树中,将关键字兄弟节点按照配置文件的树结构的层次加入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中,还包括:当关键字祖先节点对应多于1个关键字节点时,将关键字祖先节点加入对应的每一个关键字节点所在的关键字子树中;当符合预设特征的关键字兄弟节点对应多于1个关键字节点时,将关键字兄弟节点加入对应的每一个关键字节点所在的关键字子树中。
优选的,生成相应预设关键字的数据条目,具体包括:按照关键字子树的层次,由根节点开始在配置文件中查找每个节点对应的数据项,将关键字子树中所有节点对应的数据项加入相应的关键字节点条目,关键字节点条目保留了原树结构的层次。
优选的,将树结构拆分为至少一个关键字子树,具体包括:由根节点开始深度遍历配置文件的树结构,通过记录配置文件的树结构的当前节点,以及生成关键字子树的当前节点,向关键字子树中递归添加相应的节点,每次遍历完成后生成一个新的关键字子树。
优选的,向关键字子树中递归添加相应的节点,还包括:遍历至每个节点时,判断此次遍历是否有关键字节点已被处理;若此次遍历未处理关键字节点,若当前节点为关键字节点,将该节点设为当前关键字节点,标记关键字节点已处理,并加入当前关键字对应的关键字子树;若当前节点为未被占用的关键字祖先节点,将关键字祖先节点加入当前关键字对应的关键字子树;若当前节点为普通节点,将普通节点加入当前关键字对应的关键字子树;若此次遍历已处理关键字节点,若当前节点为关键字祖先节点或其他关键字节点时,不做处理,若当前节点为普通节点,将当前节点加入当前关键字对应的关键字子树。
优选的,将未被占用的关键字祖先节点加入当前关键字对应的关键字子树,还包括:比较关键字祖先节点对应的关键字节点数量和关键字祖先节点已加入的关键字子树的数量;若已加入的关键字子树的数量不小于对应的关键字节点数量,该关键字祖先节点已被占用。
另一方面,本发明提供了一种网元反算数据拆分的装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的网元反算数据拆分的方法。
与现有技术相比,本发明实施例的有益效果在于:根据配置文件的层次建立树形结构,根据细粒度可定制的预设关键字将配置文件的树形结构进行细化拆分,在保证每个数据条目信息完整、依赖关系完整、不丢失内容的前提下,使得拆分后的每个数据模型中包含的数据条目更少,冗余数据更少,因此占用内存更少,查找或统计的效率更高。进一步的,在本实施例的优选方案中,还提供了基于标记和计数的递归方法完成拆分的具体实现方式,进一步提高了网元反算数据拆分的效率。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种网元反算数据拆分的方法流程图;
图2为本发明实施例某个实际场景中使用的配置文件对应的树结构示意图;
图3为本发明实施例某个实际场景中配置文件树结构拆分后的各关键字子树示意图;
图4为本发明实施例提供的另一种网元反算数据拆分的方法流程图;
图5为本发明实施例某个实际场景中预设关键字名称路径示意图;
图6为本发明实施例提供的另一种网元反算数据拆分的方法流程图;
图7为本发明实施例提供的一种网元反算数据拆分的装置结构示意图;
其中,附图标记如下:
11:处理器;12:存储器。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
网元反算配置文件是一个设备上的全量配置集,包含了该设备上所有的配置信息。配置信息中每个配置项之间的关系可以由树形结构表示,叶子节点存放具体配置数据,而非叶子节点一般不存放具体配置数据,只是表达配置项之间的层次关系。每个节点都有名称,用以标识不同配置项。但在实际使用中,节点名称可能重复。每个配置项对应一个配置使用的数据条目,也可以将多个配置项合并为一个数据条目,每个数据条目都可以使用配置项的数据模型进行存储和处理。配置文件一般采用可扩展标记语言(ExtensibleMarkup Language,简写为XML)文件格式来描述,也可以使用其它能够表示树形层次结构的文件格式描述。在具体使用中,网管可能仅使用配置文件中的某一类数据,因此需要对配置文件中的数据进行拆分。现有的技术方案中,一般仅能够根据树本身的结构层次进行拆分,例如拆分出每个非叶子节点的所有后代节点。但在实际使用中,可能仅需使用某个叶子节点,或某个非叶子节点的部分后代。本发明针对上述背景技术存在的问题,提供了一种网元反算数据拆分方法,能够做到细粒度、可定制、高效地拆分。
如图1所示,本发明实施例提供的网元反算数据拆分的方法具体步骤如下:
步骤101:遍历网元反算配置文件对应的树结构,树结构的每个节点对应配置文件中的一个数据项。
网元反算数据在配置文件中存在层次关系的依赖,在进行拆分后依然需要保留原有的层次关系。本实施例提供的方法中,根据配置文件的特点,在进行数据拆分时,先按照配置文件的特点,使用树结构将配置文件中原有的层次关系进行一一对应的保留,并在拆分时保留相应的层次关系,使得拆分后的每条数据条目的信息完整,不丢失依赖内容。
在某个实际使用场景中,所使用的配置文件对应的树结构如图2所示。图中每个圆圈表示一个配置项,圆圈上方的文字代表节点名称。由树结构的根节点至叶子节点的路径上所有节点的名称按照层次顺序代表了一个配置项的完整名称路径,如data/interfaces/interface/name。
步骤102:根据预设关键字标记每个节点的节点类型,所述每个预设关键字在业务逻辑中具有唯一性。
在进行拆分时,可以根据网管需要使用的配置数据特征,设置适合的预设关键字,以预设关键字作为拆分基础,指定的预设关键字可以认为是标识一个配置项对应的数据条目的关键字。由于每个配置项对应的节点都有名字,为了方便匹配查找,可以使用需要拆分的配置项名字作为预设关键字。
进一步的,在实际场景中,由于配置项可能同名,所以树结构中同名的节点可能会有多个,同一个关键字对应的节点可能有多个。由于网元反算配置文件由树形结构表示,可以通过指定名称路径的方式来指定预设关键字,名称路径指树结构从根节点开始,由不同级子节点对应名称组成的路径,包含自根节点至对应的关键字节点的完整路径。在具体实施中,预设关键字的选择和具体的业务逻辑有关,通常为业务逻辑中取值具有唯一性的标识。例如,在某个具体业务场景中,使用的网络转发接口名称都互不相同,可以使用接口名称作为预设关键字,将每个接口相关的配置项单独拆分出来供网管使用。预设关键字在使用过程中也可以根据需求变化调整,做到可定制拆分。指定预设关键字时,可以根据需要同时指定多个预设关键字,拆分出多个相应的数据条目。进一步的,若网元反算配置文件未指定任何关键字,则将整个配置文件作为一个数据条目。
在指定预设关键字时,可以根据网管需要使用的数据条目针对性的指定任意一个或多个预设关键字,将该关键字相关的配置拆分出来。当预设关键字对应树结构叶子节点时,拆分的数据条目为该节点配置项及关联节点配置项;当预设关键字对应树结构非叶子节点时,拆分的数据条目对应该非叶子节点后代的所有配置项及关联节点配置项。具体实施场景中,可以通过改变指定的预设关键字,做到拆分粒度可以控制,在预设关键字为非叶子节点时,可兼容按照配置块类型拆分的现有技术。例如,在某个具体场景中,根据以太口配置的数量生成对应数量的数据条目,可以通过指定以太口的名称作为预设关键字,为每个以太口配置生成单独的数据条目;也可以通过指定以太口配置节点的祖先节点名称作为预设关键字,生成一个包含所有以太口配置的数据条目。
由于配置文件的树结构中包含对应预设关键字的节点,以及不对应预设关键字的节点,两种节点在进行拆分时需要进行不同的处理,以便提高拆分效率,在拆分前可以先对节点类型进行区分和标记。节点类型包括关键字节点、关键字祖先节点和普通节点。普通节点包括关键字后代节点和关键字兄弟节点,其中关键字兄弟节点特指祖先和后代均为非关键字节点的节点。
预设关键字的名称路径在树形结构中代表的节点称为关键字节点,本身非关键字但有关键字后代的节点称为关键字祖先节点,一个关键字的所有关键字祖先节点和关键字节点按照层次关系构成了一条完整的名称路径,每个关键字节点确定的这条名称路径及对应的普通节点构成的完整数据称为一个关键字节点条目。树结构中其余节点称为普通节点。在一个配置文件对应的树结构中,普通节点、关键字节点、关键字祖先节点构成所有节点的集合。若节点的名称与预设关键字相匹配即为关键字节点,非关键字节点为任一关键字节点的祖先即为关键字祖先节点。普通节点包括关键字后代节点和关键字兄弟节点,非关键字节点为任一关键字节点的后代即为关键字后代节点,非关键字节点不是任一关键字节点的祖先或后代即为关键字兄弟节点。任一节点都仅具有唯一类型,且四种类型节点的并集就是配置文件树中的所有节点,因此能够保证数据的完整性,并避免了因某个节点属于多个类型而导致拆分时无法确认该节点属于哪个关键字子树。
在具体实施过程中,可以通过节点名称路径与预设关键字匹配与否判断节点是否为关键字节点,当遍历到的节点的名称路径与预设关键字相匹配时,标记该节点为关键字节点。通过查找关键字节点的所有祖先节点判断其是否为关键字祖先节点,对于每个关键字节点,遍历其所有祖先节点,将遍历到的祖先节点标记为关键字祖先节点。剩余节点即为普通节点,标记完关键字节点和关键字祖先节点后,剩下的关键字后代节点和关键字兄弟节点在本实施例中统称为普通节点,进行相同的处理,不需要进行额外标记。
步骤103:根据节点类型,以及每个节点与关键字节点的关系,将树结构拆分为至少一个关键字子树,每个关键字子树中有且仅有一个关键字节点。
每个预设关键字可以对应多个关键字节点,而每个数据条目只含一个关键字节点,因此每个预设关键字可能对应多个数据条目。每个关键字节点还需要包含完整的祖先、后代及兄弟节点数据以及相应的层次信息,在进行拆分时,不能仅单纯的将关键字节点拆出,而是需要拆分出关键字节点所在的最小子树,最小子树中包含关键字节点向上直至根节点的所有祖先,以及向下直至叶节点的所有后代,每个关键字节点所在的子树称为一个关键字子树。在树结构中,可能还存在祖先和后代均为非关键字节点的节点,我们称为关键字兄弟节点,由于树结构中节点间的距离反映节点间的关系紧密度,为了保留树结构的完整信息,还需要将所有关键字兄弟节点放入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中。
根据关键字子树的定义,以关键字节点为拆分基础,可以确定关键字子树的拆分原则如下。
(1)将关键字节点保留在对应的关键字子树中,每个关键字节点对应唯一一个关键字子树。以确保拆分后的每个关键字节点对应的名称路径互相独立存在。
(2)将关键字后代节点按照配置文件的树结构的层次关系加入对应的关键字子树中。当关键字节点为非叶子节点时,相当于对某一类配置项进行拆分,需要保留其所有后续节点,以获取该类配置项的全部信息。
(3)将关键字祖先节点按照配置文件的树结构的层次关系加入对应的关键字子树中,以保留关键字节点对应的完整路径名称信息。
(4)将关键字兄弟节点按照配置文件的树结构的层次加入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中。将关键字节点、关键字后代节点和关键字祖先节点放入对应的关键字子树后,还剩下祖先和后代均为非关键字节点的关键字兄弟节点,基于树结构的远近关系,可以查找与这些节点具有最下层最近公共祖先的关键字节点。最近公共祖先表示两个节点之间的最下层的公共祖先,而最下层最近公共祖先表示一个节点和所有关键字节点之间的全部最近公共祖先中,位于最下层的节点。例如:若有关键字兄弟节点N1和关键字节点K1-Kn,则N1和每个Kk(1<=k<=n)之间有最近公共祖先Lk,构成最近公共祖先集L1-Ln,其中最下层的最近公共祖先为Lm(1<=m<=n),则Lm在本实施例中称为最下层最近公共祖先。查找到最下层最近公共祖先后,可以将关键字兄弟节点加入该最下层最近公共祖先对应的关键字节点Km所在的关键字子树。由于树结构中所有节点的公共祖先为根节点,因此所有关键字兄弟节点都能够找到应加入的关键字子树。
根据上述配置拆分原则,即可将配置文件的树结构根据预设关键字拆分为关键字子树,每个关键字子树的全部节点对应一个关键字节点的关键字节点条目。进行拆分时,一个直观的算法是先遍历配置文件树形结构,得到所有关键字节点。由于每个关键字节点都唯一确定了一个关键字节点条目,只需对树结构中每一个关键字节点,查找其关键字祖先节点和后代节点,以及具有最下层最近公共祖先的关键字兄弟节点,按照原层次关系放入一个关键字子树中即可。对树结构中的所有关键字节点建立关键字子树后,即完成了树结构的拆分。
步骤104:根据关键字子树中包含的节点,生成相应预设关键字的数据条目。
当所有关键字子树按照步骤103中的原则建立后,每个关键字子树的全部节点对应其中包含的关键字节点的关键字节点条目。具体的,按照关键字子树的层次,由根节点开始在配置文件中查找每个节点对应的数据项,将关键字子树中所有节点对应的数据项加入相应的关键字节点条目。
经过本实施例中提供的步骤101-步骤104后,按照网管的使用需要设定了所需粒度的预设关键字,根据预设关键字对配置文件的树结构进行了拆分,获取到了每个关键字节点条目,实现了网元反算数据的细粒度可指定拆分。如图3所示,为某个具体场景中,如图1所示的配置文件树结构拆分后的各关键字子树示意图。该场景中,根据业务逻辑指定预设关键字的名称路径为data/interfaces/interface/name和data/mpls-te/interf ace/ifname,对应4个关键字节点,图中以黑色圆圈表示,从左到右分别编号为节点1到节点4。
进一步的,为了避免节点类型冲突导致拆分关键字子树时无法唯一确定某个节点的拆分方法,在步骤101中指定预设关键字时,预设关键字的名称路径不允许嵌套,即两个关键字节点不能是祖先和后代的关系。若预设关键字中存在嵌套,忽略祖先节点,在名称路径列表中删除祖先节点对应的名称路径。如图1中,当指定了data/interfaces/interface/name和data/mpls-te/interface/ifname这2个名称路径,若还指定了data/inte rfaces/interface为名称路径,即总共指定了3个名称路径,该路径和da ta/interfaces/interface/name形成嵌套关系,会自动忽略,并从名称路径列表中删除data/interfaces/interface,仍然只保留2个名称路径。
为了避免出现嵌套的情况,需要对可能出现的嵌套情况进行处理。在具体实施场景中,可以根据实际情况选择合适的处理方式。在某种具体场景中,预设关键字可以进行修改,将预设关键字的名称路径作为字符串,查找每个预设关键字对应字符串是否是其余某个预设关键字对应字符串的子串,若是,则代表该预设关键字和其余某个预设关键字形成嵌套关系,删除作为子串的预设关键字。在另一种具体实施场景中,预设关键字不能直接进行修改,在遍历查找某个关键字节点的关键字祖先节点时,当遍历到的祖先节点对应与该关键字节点不同的预设关键字时,关键字祖先节点对应的预设关键字不再作为预设关键字使用。经过上述操作,即可保证所有预设关键字中不存在互相嵌套的名称路径。
在本实施例的具体实施场景中,配置文件可能会出现一些特殊情况,在步骤103中拆分关键字子树时需要做进一步的处理。其中,常见情况如下,其它情况可以参考步骤103中描述的拆分原则及以下处理方法进行相应的处理。
(1)由于配置文件中可能存在多个同名配置项,因此每个名称路径可能对应多个关键字节点,形成多个数据条目。例如,对于图1中的树结构,对于预设关键字data/interfaces/interface/name和data/mpls-te/inte rface/ifname,每个预设关键字对应2个关键字节点,共对应4个关键字节点,形成4个数据条目,每个数据条目有且仅有一个关键字节点。本实施例提供的拆分方法,无论在包含一个关键字还是多个关键字的情况下,都可以将配置文件原本的完整树结构拆分为多个包含关键字节点的子树,每个子树中有且只有一个关键字节点,无需对树结构进行多次遍历查找。
(2)在配置文件中多个配置项可能属于同一个类别,在配置文件的树结构中表现为多个节点具有公共祖先节点。在该场景中,在步骤103的拆分过程中,可能出现多个关键字节点共用一个关键字祖先节点的情况。此时,为了保留路径名称完整的层次关系和信息,当关键字祖先节点对应多于1个关键字节点时,共用的关键字祖先节点需要按照后代关键字节点的数量复制相应的份数,将关键字祖先节点加入其后代所有关键字节点所在的关键字子树中,由多个预设关键字的数据条目共用。如图1中的interf aces节点表示以太口的集合,为2个关键字节点data/interfaces/interf ace/name的共用关键字祖先节点,需要保留在2个关键字节点各自对应的关键字子树中。
(3)在配置文件中可能存在多条数据条目共用的公共数据,在树结构中,该公共数据对应某个关键字兄弟节点,该节点对应多个满足最下层最近公共祖先条件的关键字节点。例如,图1中的router-id节点表示MPLS配置中的路由器ID,在预设关键字为data/interfaces/interface/name和data/mpls-te/interface/ifname时,该节点与前两个关键字节点的最近公共祖先为data节点,与后两个关键字节点的最近公共祖先为mpls-te节点,在data节点和mpls-te节点这两个最近公共祖先中,显然mpls-te节点与router-id节点的距离更短,mpls-te节点为router-id节点的最下层最近公共祖先,mpls-te节点对应的关键字节点有2个,因此router-id节点为公共数据。为了确保两个关键字节点的关键字节点条目中都包含这一项需要使用的公共数据,需要将router-id加入两个关键字节点各自的关键字子树中。
通过上述特殊情况的处理方式,可以对具有不同层次关系特征的配置文件进行有效且准确的数据拆分,为网管提供细粒度、准确、完整的配置数据条目。
如图4所示,可以通过以下步骤完成上述情况下的节点标记和关键字子树拆分。
步骤201:遍历配置文件树形结构,如果当前节点的名称路径与预设关键字匹配,则标记该节点为关键字节点,并记录在关键字列表中。
步骤202:判断关键字列表中的所有关键字节点是否都已被处理。若是,结束处理;若否,在关键字列表中取一个关键字节点设为N1,并转步骤203。
步骤203:对于关键字节点N1,遍历配置文件树形结构,判断这次遍历是否完成。若是,则关键字节点N1的关键字子树已建立完成,转步骤202进行下一个关键字节点的遍历;若否,获取配置文件的树结构中下一个遍历到的节点作为遍历到的当前节点,将遍历到的当前节点设为N2,转步骤204。
步骤204:判断N2与N1是否为同一个关键字节点,若是,将N2加入N1的关键字子树中,并转步骤203;若否,转步骤205。
步骤205:判断N2是否为其他关键字节点。若是,由于每条数据有且只有一个关键字节点,则N2不属于当前关键字节点N1的关键字子树,转步骤203;若否,转步骤206。
步骤206:计算N1和N2的最近公共祖先,设为L1。
步骤207:判断L1与N1或N2是否相同。若是,即N1为N2祖先或N2为N1祖先,则N2为N1的关键字祖先或后代节点,属于该关键字节点条目,将N2加入N1的关键字子树,并转步骤203;若否,表示N2为关键字兄弟节点,转步骤208。
步骤208:计算N2和所有其他关键字节点的最近公共祖先,判断L1是否在这些最近公共祖先中位于树结构的最低层次,或与其他节点并列为树结构的最低层次。若是,表示L1在N2和所有关键字节点组成的最近公共祖先中,离N2距离最近,则N2属于该关键字节点条目,将N2加入N1的关键字子树中,转步骤203;若否,表示N2不属于该关键字节点条目,不将N2加入N1的关键字子树中,转步骤203。
经过步骤201-步骤208,针对每一个预设关键字对应的每一个关键字节点,对配置文件树结构中关键字节点、关键字祖先节点、关键字后代节点和关键字兄弟节点的归属进行了判定,并根据判定结果进行相应的处理。
进一步的,在步骤201-步骤208中,对于步骤201中标记的每个关键字节点,步骤202中都需要处理,而且每个处理的过程都需要在步骤203中遍历配置文件的整个树结构,判断每个节点是否属于该关键字节点条目。假设配置文件树形结构共有n个节点,其中关键字节点为m个,则需要总共遍历m*n次节点。而判断的过程又需要在步骤208中计算每个节点和所有关键字节点的最近公共祖先,即使将计算结果保存下来,每两个节点之间仅计算一次,也需要计算m*n次最近公共祖先。
为了减少拆分过程中的遍历次数和最近公共祖先计算次数,提高拆分效率,还可以对上述拆分方法进行优化。由根节点开始深度遍历配置文件的树结构,通过记录配置文件的树结构的当前节点,以及生成关键字子树的当前节点,向关键字子树中递归添加相应的节点。生成关键字子树的递归方法输入参数包括配置文件树结构的当前节点,及生成关键字子树的当前节点。在递归执行过程中,会以生成关键字子树的当前节点为基础,向关键字子树中不断添加节点,最终形成完整的关键字子树。
在本实施例提供的方法中,保证了每次遍历都能生成一个新的关键字子树,对每个节点进行了标记和计数,通过增加判断来减少需要遍历或处理的节点数量,实现高效拆分。
遍历至每个节点时,判断此次遍历是否有关键字节点已处理。若此次遍历尚未处理关键字节点,若遍历到的当前节点为关键字节点,则将该节点设为当前关键字节点,标记关键字节点已处理,并加入当前关键字对应的关键字子树,若当前节点为未被占用的关键字祖先节点,则加入当前关键字对应的关键字子树,若当前节点为普通节点,则加入当前关键字对应的关键字子树。若此次遍历已处理关键字节点,若当前节点为关键字祖先节点或其他关键字节点,则不做处理,若当前节点为普通节点,则加入当前关键字对应的关键字子树。该方法具体实施时,可以设置一个全局变量,即已碰到关键字节点标识位。设置初始值时,将配置文件树形结构的当前节点参数置为配置文件树形结构根节点,生成子树形结构的当前节点参数置为空,已碰到关键字节点标识位全局变量置为假。
比较关键字祖先节点对应的关键字节点数量和关键字祖先节点已加入的关键字子树的数量。若已加入的关键字子树的数量不小于对应的关键字节点数量,该关键字祖先节点已被占用。每个节点的节点计数表示该节点或该节点的后代节点中关键字节点的个数。需通过遍历配置文件树形结构来为每个节点标记节点类型,并对节点计数。具体方法如下:预设配置文件树形结构每个节点的节点计数为0。遍历配置文件树形结构,遍历树的方式不限,1)如果当前节点的名称路径与预设关键字匹配,则标记该节点类型为关键字节点,将节点计数加1。然后依次向上寻找该关键字节点的所有祖先节点,都标记为关键字祖先节点,将节点计数加1。处理完毕,继续遍历下一个节点。2)如果当前节点的名称路径与预设关键字不匹配,则不处理,继续遍历下一个节点。遍历完树结构之后,将节点计数仍然为0的节点,即未被标记的节点,标记为普通节点,将节点计数记为0。关键字节点和关键字祖先节点的计数代表该节点应存在的关键字子树数量。每个关键字节点或关键字祖先节点被拆分至一个关键字子树后,节点计数减1,当节点计数为0时,表示已被拆分至所有应存在的关键字子树中,无需再进行处理。由于一个关键字节点只会出现在一个关键字节点条目中,因此关键字节点的计数只能为0或1。当根节点的节点计数为0时,表示树结构中所有节点处理完毕,所有关键字子树已生成。普通节点的节点计数在计算中无需使用,一直保持为默认值0。如图5所示,根据业务逻辑指定预设关键字的名称路径为data/interfaces/interface/name和data/mpls-te/inte rface/ifname,对应4个关键字节点,图中以黑色圆圈表示,每个节点圆圈里面的数字表示节点计数的值。
在某个具体实施场景中,将上述优化方法相结合,将步骤201-步骤208中提供的拆分方法优化为如图6示的步骤。在以下步骤执行之前,需通过上述方法遍历配置文件树形结构来为每个节点标记节点类型,并对节点计数。以下步骤为一次递归时的算法,可生成一个关键字子树。通过深度遍历完成对配置文件的树结构中所有节点的遍历,递归的输入参数包括配置文件的树结构的当前节点,及当前关键字子树的当前节点,此外还包括一个全局变量作为已碰到关键字节点标识用于判断。
步骤301:判断已碰到关键字节点标识位是否为真。若是,表明当前关键字子树对应的关键字节点已找到,转步骤302;若否,表明当前关键字子树对应的关键字节点还未找到,转步骤303。
步骤302:判断当前节点是否为普通节点,若是,转步骤308;若否,表明当前节点为另一个关键字节点,与当前关键字子树不对应,或表明当前节点为关键字祖先节点,和别的关键字节点关系更近,不进行处理,转步骤309。
步骤303:获取当前节点的节点类型。若当前节点为关键字祖先节点,转到步骤304;若当前节点为关键字节点,转到步骤305;若当前节点为普通节点,转步骤308。
步骤304:判断当前节点的节点计数是否为0。若节点计数大于0,表明该节点还需要加入关键字子树,转步骤307;若节点计数等于0,说明该节点已加入所有对应的关键字子树,转到步骤309。
步骤305:判断当前节点的节点计数是否为0。若节点计数大于0,表明该节点还需要加入关键字子树,转到步骤306;若节点计数等于0,说明该节点已加入所有对应的关键字子树,转步骤309。
步骤306:设置已碰到关键字节点标识为真,意为已经碰到了未被占用的关键字节点,将当前节点计数减1,以统计节点占用情况,转步骤308。
步骤307:将当前节点计数减1,以统计节点占用情况,转步骤308。
步骤308:将当前节点拷贝到当前关键字子树,并记录当前关键字子树的当前节点位置。在当前节点拷贝到当前关键字子树之后,记录当前关键字子树新拷贝的节点位置,作为再次递归的一个输入参数。
步骤309:判断是否已遍历所有节点。若是,表示当前关键字子树已生成;若否,将当前节点的每个子节点,以及步骤308中记录的当前关键字子树的当前节点位置,作为递归参数,转至步骤301再次进行递归。
通过步骤301-步骤309,通过递归、标记和计数的方式,能高效快速完成拆分操作,且生成的数据条目较小,较易转换为PB数据结构。由上述步骤可见,在m个关键字节点的场景中,只需要经过m次遍历可以生成m个对应的关键字子树,如果忽略无需处理的节点,每次遍历平均只需遍历大约1/m节点。假设配置文件树形结构共有n个节点,总共需要遍历大约n个节点,生成m个关键字子树。而且在遍历过程中,无需计算每个节点和所有关键字节点的最近公共祖先,效率大大提高。
本实施例提供的网元反算数据拆分的方法,通过合理指定预设关键字,可实现细粒度地拆分,如将每个以太口的配置生成单独的数据条目。还可以通过不同的预设关键字指定策略,实现可定制地拆分,如MPLS配置中的路由器ID,将其指定成预设关键字可生成单独的数据条目,若不将其指定则作为多个MPLS接口数据条目共用的公共数据。进一步的,本实施例还提供了优化的拆分方式,进行拆分时对配置文件树结构的遍历次数等于关键字节点个数,保证每次遍历都能生成一个新的关键字子树,即生成一个关键字节点条目。并进一步的通过标记和计数跳过大多无需处理的节点,获得更好的处理效率。
实施例2:
在上述实施例1提供的网元反算数据拆分的方法的基础上,本发明还提供了一种可用于实现上述方法的网元反算数据拆分的装置,如图7示,是本发明实施例的装置架构示意图。本实施例的网元反算数据拆分的装置包括一个或多个处理器11以及存储器12。其中,图7以一个处理器11为例。
处理器11和存储器12可以通过总线或者其他方式连接,图7以通过总线连接为例。
存储器12作为一种网元反算数据拆分方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的网元反算数据拆分方法。处理器11通过运行存储在存储器12中的非易失性软件程序、指令以及模块,从而执行网元反算数据拆分的装置的各种功能应用以及数据处理,即实现实施例1的网元反算数据拆分的方法。
存储器12可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器12可选包括相对于处理器11远程设置的存储器,这些远程存储器可以通过网络连接至处理器11。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器12中,当被一个或者多个处理器11执行时,执行上述实施例1中的网元反算数据拆分的方法,例如,执行以上描述的图1、图4、图6示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为:ROM)、随机存取存储器(Random AccessMemory,简写为:RAM)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种网元反算数据拆分的方法,其特征在于:
遍历网元反算配置文件对应的树结构,所述树结构的每个节点对应配置文件中的一个数据项;
根据预设关键字标记每个节点的节点类型,所述每个预设关键字在业务逻辑中具有唯一性,所述节点类型包括关键字节点、关键字祖先节点、关键字后代节点和关键字兄弟节点;
根据节点类型,以及每个节点与关键字节点的关系,将树结构拆分为至少一个关键字子树,每个关键字子树中有且仅有一个关键字节点,每个关键字子树包含关键字节点在配置文件对应的树结构中所有的祖先和后代,及符合预设特征的关键字兄弟节点;
根据关键字子树中包含的节点,生成相应预设关键字的数据条目。
2.根据权利要求1所述的网元反算数据拆分的方法,其特征在于,所述根据预设关键字标记每个节点的节点类型,具体包括:
当遍历到的节点的名称与预设关键字相匹配时,标记该节点为关键字节点;
对于每个关键字节点,遍历其所有祖先节点,将遍历到的祖先节点标记为关键字祖先节点。
3.根据权利要求2所述的网元反算数据拆分的方法,其特征在于,所述将遍历到的祖先节点标记为关键字祖先节点,还包括:
当遍历到的祖先节点对应与该关键字节点不同的预设关键字时,关键字祖先节点对应的预设关键字不再作为预设关键字使用。
4.根据权利要求1所述的网元反算数据拆分的方法,其特征在于,所述将树结构拆分为至少一个关键字子树,具体包括:
将关键字节点保留在对应的关键字子树中,每个关键字节点对应唯一一个关键字子树;
将关键字节点的后代节点按照配置文件的树结构的层次关系加入对应的关键字子树中;
将关键字祖先节点按照配置文件的树结构的层次关系加入对应的关键字子树中;
将关键字兄弟节点按照配置文件的树结构的层次加入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中。
5.根据权利要求4所述的网元反算数据拆分的方法,其特征在于,所述关键字祖先节点按照配置文件的树结构的层次关系加入对应的关键字子树中,将关键字兄弟节点按照配置文件的树结构的层次加入满足最下层最近公共祖先条件的关键字节点所在的关键字子树中,还包括:
当关键字祖先节点对应多于1个关键字节点时,将关键字祖先节点加入对应的每一个关键字节点所在的关键字子树中;
当符合预设特征的关键字兄弟节点对应多于1个关键字节点时,将关键字兄弟节点加入对应的每一个关键字节点所在的关键字子树中。
6.根据权利要求1所述的网元反算数据拆分的方法,其特征在于,所述生成相应预设关键字的数据条目,具体包括:
按照关键字子树的层次,由根节点开始在配置文件中查找每个节点对应的数据项,将关键字子树中所有节点对应的数据项加入相应的关键字节点条目,关键字节点条目保留了原树结构的层次。
7.根据权利要求1所述的网元反算数据拆分的方法,其特征在于,所述将树结构拆分为至少一个关键字子树,具体包括:
由根节点开始深度遍历配置文件的树结构,通过记录配置文件的树结构的当前节点,以及生成关键字子树的当前节点,向关键字子树中递归添加相应的节点,每次遍历完成后生成一个新的关键字子树。
8.根据权利要求7所述的网元反算数据拆分的方法,其特征在于,所述向关键字子树中递归添加相应的节点,还包括:
遍历至每个节点时,判断此次遍历是否有关键字节点已被处理;
若此次遍历未处理关键字节点,若当前节点为关键字节点,将该节点设为当前关键字节点,标记关键字节点已处理,并加入当前关键字对应的关键字子树;若当前节点为未被占用的关键字祖先节点,将关键字祖先节点加入当前关键字对应的关键字子树;若当前节点为普通节点,将普通节点加入当前关键字对应的关键字子树;
若此次遍历已处理关键字节点,若当前节点为关键字祖先节点或其他关键字节点时,不做处理,若当前节点为普通节点,将当前节点加入当前关键字对应的关键字子树。
9.根据权利要求8所述的网元反算数据拆分的方法,其特征在于,所述将未被占用的关键字祖先节点加入当前关键字对应的关键字子树,还包括:
比较关键字祖先节点对应的关键字节点数量和关键字祖先节点已加入的关键字子树的数量;
若已加入的关键字子树的数量不小于对应的关键字节点数量,该关键字祖先节点已被占用。
10.一种网元反算数据拆分的装置,其特征在于:
包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储能被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-9中任一项所述的网元反算数据拆分的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210894777.1A CN115168296A (zh) | 2022-07-28 | 2022-07-28 | 一种网元反算数据拆分的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210894777.1A CN115168296A (zh) | 2022-07-28 | 2022-07-28 | 一种网元反算数据拆分的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115168296A true CN115168296A (zh) | 2022-10-11 |
Family
ID=83497280
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210894777.1A Pending CN115168296A (zh) | 2022-07-28 | 2022-07-28 | 一种网元反算数据拆分的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115168296A (zh) |
-
2022
- 2022-07-28 CN CN202210894777.1A patent/CN115168296A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8208408B2 (en) | Tree-based node insertion method and memory device | |
US6564211B1 (en) | Fast flexible search engine for longest prefix match | |
US6915340B2 (en) | System and method for deriving future network configuration data from the current and previous network configuration data | |
CN103561133B (zh) | 一种ip地址归属信息索引方法及快速查询方法 | |
CN111190904B (zh) | 一种图-关系数据库混合存储的方法和装置 | |
CN110147204B (zh) | 一种元数据落盘方法、装置、系统及计算机可读存储介质 | |
JP2001274837A (ja) | データ・パケットを分類する方法および手段 | |
CN110222238B (zh) | 字符串与识别符双向映射的查询方法和系统 | |
CN108134739B (zh) | 一种基于索引特里树的路由查找方法及装置 | |
JP3570323B2 (ja) | アドレスに関するプレフィクスの格納方法 | |
WO2015010509A1 (zh) | 一种基于一维线性空间实现Trie树的词典检索方法 | |
CN112667860A (zh) | 一种子图匹配方法、装置、设备及存储介质 | |
CN112131356B (zh) | 一种基于tcam的报文关键字匹配方法和装置 | |
CN110928939A (zh) | 一种基于树形结构的Sql结果集向Json数据转换的方法 | |
CN115718819A (zh) | 一种索引构建方法、数据读取方法及索引构建装置 | |
CN117271531B (zh) | 一种数据存储方法、系统、设备及介质 | |
CN114372174A (zh) | 一种xml文档分布式查询方法及系统 | |
CN114168591A (zh) | 寻找树形结构数据路径节点的方法 | |
CN106484815A (zh) | 一种基于海量数据类sql检索场景的自动识别优化方法 | |
CN111241090B (zh) | 存储系统中管理数据索引的方法和装置 | |
CN115269745B (zh) | 一种关系型数据至图数据映射方法、设备及存储介质 | |
CN115168296A (zh) | 一种网元反算数据拆分的方法和装置 | |
CN106933844B (zh) | 面向大规模rdf数据的可达性查询索引的构建方法 | |
US20220215021A1 (en) | Data Query Method and Apparatus, Computing Device, and Storage Medium | |
CN116089487A (zh) | 查询流水线执行的调度 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |