CN106095788A - 一种数据存储方法及装置 - Google Patents
一种数据存储方法及装置 Download PDFInfo
- Publication number
- CN106095788A CN106095788A CN201610367629.9A CN201610367629A CN106095788A CN 106095788 A CN106095788 A CN 106095788A CN 201610367629 A CN201610367629 A CN 201610367629A CN 106095788 A CN106095788 A CN 106095788A
- Authority
- CN
- China
- Prior art keywords
- chained list
- data
- stored
- level
- target
- 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.)
- Withdrawn
Links
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/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例公开了一种数据存储方法及装置,针对待存储数据,构建至少两级链表,该待存储数据存储在底层链表中,在底层链表包含的存储数据全部相同时,删除该底层链表,并更新该底层链表在上一级链表中的状态。一方面,将包含的存储数据全部相同的底层链表删除,节省了内存空间的占用;另一方面,当数据量很大、构建了多个底层链表时,如果出现数据变化的情况,仅需修改该数据对应的底层链表及该底层链表在上一级链表中的状态,不需要将全部链表进行解压‑修改‑压缩的处理,提高了执行效率。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种数据存储方法及装置。
背景技术
随着科学技术的发展,计算机已深入人们的生活,并带来了巨大的便利。目前,利用计算机存储数据已十分普遍。比如,公司记录员工的考勤数据,一般都采用计算机来存储。
例如,公司A需要记录8个员工的考勤信息,传统的记录方案是在计算机中存储每一天正常考勤员工的ID列表,比如:2016-2-15:[1,2,3,4,5,6,7,8]。假如员工ID采用的数据类型是CHAR型(占用1个BYTE),则在没有员工缺勤的情况下,存储当天的考勤记录需要8个BYTE(内存占用总数=员工个数*员工ID数据类型占用内存数)。当该公司的规模再扩大,比如扩大到100000个员工时,那么员工ID的数据类型就不能使用CHAR型,因为CHAR型数据只能表示0~127,员工ID的类型必须使用INT型(占用4个BYTE),则在没有员工缺勤的情况下,存储当天的考勤记录需要400,000(即100000*4)个BYTE。
一种更优的方案是构造一个BIT-MAP(位图文件),用于存储每一个员工的考勤信息,如果某员工当前的考勤正常,则将该员工对应的位置设置成1,否则设置成0。
以上述例子进行说明,当公司A中存在8个员工时,将这些员工映射到一个8个BIT的数组中,假设2016-2-16这天员工4和员工7考勤不正常时,其所对应的BIT-MAP如图1所示。由此可以看出,仅需8个比特位(即1个BYTE)便可存储所有员工的考勤信息,所占用的计算机的内存为传统方案的1/8。当该公司的规模再扩大,比如扩大到100000个员工时,需要申请一个12500(即100000/8)个BYTE的CHAR型数组arrayA,其中:arrayA[0]对应十进制数0~7,arrayA[1]对应十进制数8~15,arrayA[2]对应十进制数16~23……以此类推。因此,采用构造BIT-MAP的方案,占用的计算机的内存仅为传统方案的1/32(即12500/400000)。
综上所述,当记录的数据中最大的数为N时,所需要消耗的内存最多为(1+N/8)个BYTE,通过采用构造BIT-MAP的方案能够很大程度上节省计算机内存。
但是在很多的使用场景中,BIT-MAP数据结构中的比特位为0或者比特位为1都是连续的,如上面例子中的员工考勤,对于工作日,绝大部分员工所对应的比特位都是1(即考勤正常),因此该BIT-MAP数据结构仍然可以进行压缩和优化,进一步的节省内存。
针对BIT-MAP数据结构中的比特位为0或者比特位为1都是连续的这一特点,通常使用的方案是引入字符串压缩技术,比如对BIT-MAP字符串采用RLE(run-lengthencoding,游程编码)编码方法进行压缩。如图2的BIT-MAP为例:可以将图2中的BIT-MAP编码为0,7,2,9,1,10,3。其意思是:第一位为0,连续有7个,接下来是2个1,9个0,1个1,10个0,最后是3个1(这里只是对RLE编码基本原理的解释,实际中的编码可能会存在差异)。
对于一个数据量很大的BIT-MAP,如果里面的数据分布存在大片连续的0或者大片连续的1,采用RLE编码方法将其进行压缩,会节省很多内存的占用。
但是,采用RLE编码方法,如果BIT-MAP中的某一个比特位发生变化,需要向将压缩的RLE编码解压成原始的BIT-MAP数据,将原始的BIT-MAP数据修改之后,再将修改后的BIT-MAP压缩成RLE编码格式。
因此,对于数据频繁变化的情况,采用RLE编码方法压缩BIT-MAP数据,执行效率很低。
发明内容
本发明实施例的目的在于提供一种数据存储方法及装置,在节省计算机内存的基础上,针对数据频繁变化的情况,提高执行效率。
为达到上述目的,本发明实施例公开了一种数据存储方法,包括:
获得待存储数据,并确定所述待存储数据对应的目标链表以及所述待存储数据在所述目标链表的存储位置;
将所述待存储数据存储至所述存储位置;
在所述目标链表包含的所述数据全部相同时,删除所述目标链表,并更新所述目标链表在上一级链表中的状态。
为达到上述目的,本发明实施例还公开了一种数据存储装置,包括:
获得确定模块,用于获得待存储数据,并确定所述待存储数据对应的目标链表以及所述待存储数据在所述目标链表的存储位置;
存储模块,用于将所述待存储数据存储至所述存储位置;
删除更新模块,用于在所述目标链表包含的所述数据全部相同时,删除所述目标链表,并更新所述目标链表在上一级链表中的状态。
由上述技术方案可见,应用本发明所示实施例,针对待存储数据,构建至少两级链表,该待存储数据存储在底层链表中,在底层链表包含的存储数据全部相同时,删除该底层链表,并更新该底层链表在上一级链表中的状态。一方面,将包含的存储数据全部相同的底层链表删除,节省了内存空间的占用;另一方面,当数据量很大、构建了多个底层链表时,如果出现数据变化的情况,仅需修改该数据对应的底层链表及该底层链表在上一级链表中的状态,不需要将全部链表进行解压-修改-压缩的处理,提高了执行效率。
当然,实施本发明的任一产品或方法必不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为背景技术所举实例中对应的一个BIT-MAP;
图2为背景技术所举实例中对应的另一个BIT-MAP;
图3为本发明实施例提供的一种数据存储方法的流程示意图;
图4为本发明实施例提供的一种数据结构;
图5为本发明实施例提供的另一种数据结构;
图6为本发明实施例提供的一种数据存储装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了解决现有技术问题,本发明实施例提供了一种数据存储方法及装置。下面首先对本发明实施例提供的一种数据存储方法进行详细说明。
图3为本发明实施例提供的一种数据存储方法的流程示意图,包括:
S101:获得待存储数据,并确定待存储数据对应的目标链表以及待存储数据在目标链表的存储位置。
需要说明的是,以链表形式存储数据,可以以多级链表的形式对数据进行存储,本发明实施例中所述目标链表指的是多级链表中最底层的链表。
在本发明所示实施例中,链表中可以以位图形式存储数据。
作为本发明的一种实施方式,可以预先建立待存储数据与底层链表的对应关系、及待存储数据与其对应的底层链表的存储位置的对应关系。根据建立的对应关系,确定待存储数据对应的目标链表以及待存储数据在目标链表的存储位置。
假设待存储数据为A公司的考勤数据,A公司有120个员工,针对A公司的考勤数据构建了两级链表,每个底层链表能容纳40条数据,则需构建3个底层链表。
可以根据员工ID号或名称等,建立员工考勤数据与底层链表及底层链表的位图中的存储位置的对应关系,比如,ID号为1-40的员工考勤数据对应第一个底层链表,ID号为41-80的员工考勤数据对应第二个底层链表,ID号为81-120的员工考勤数据对应第三个底层链表;ID号为1的员工对应第一个底层链表的位图中的编号为0的比特位,ID号为2的员工对应第一个底层链表中的编号为1的比特位等等。
将考勤数据以位图形式存储在底层链表中,考勤数据可以有两种取值,比如用0表示缺勤,用1表示考勤正常。
假设获取了一条待存储数据:ID号为7的员工于2016年4月13日的考勤正常(即该待存储数据为1),确定该待存储数据对应的目标链表为第一个底层链表,确定该待存储数据在第一个底层链表的存储位置为编号为6的比特位。
在本发明所示实施例中,可以预设x级链表,所述x为大于1的整数。确定的目标链表为底层链表,即第x级链表。确定的待存储数据的存储位置为:在第x级链表的存储位置。确定目标链表之前,可以依次确定所述待存储数据对应的第一级链表至第x-1级链表。
在上述实施例中,链表的级别与数量均可以设定很多,链表结构比较复杂,因而,建立待存储数据与底层链表的对应关系、及待存储数据与其对应的底层链表的存储位置的对应关系,可以采用确定编号的方式。
作为本发明的一种实施方式,确定待存储数据对应的第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;
确定待存储数据对应的第x级链表的编号为:[(i%p1%p2%...%pj…%px-1)/px];
所述i为待存储数据的编号,i为非负整数;
所述pj为第j级链表对应的待存储数据的个数,pj=wx*wx-1*…*wj,所述wj为预设的第j级链表存储的状态的个数,wj=yj/oj,所述yj为预设的第j级链表的容量,单位为比特,所述oj为预设的第j+1级链表的状态在第j级链表中占用的比特位数;
所述px为第x级链表存储的所述待存储数据的个数,px=wx=yx/ox,所述yx为预设的第x级链表的容量,单位为比特,所述ox为预设的待存储数据在第x级链表中占用的比特位数。
在上述实施方式中,待存储数据在第x级链表的存储位置为一个比特位组,所述比特位组包括:从编号为(i%px)*ox的比特位到编号为(i%px)*ox+ox-1的比特位。
下面对上述实施方式进行详细说明:
预设x级链表,对于第j(j的范围是1~x)级链表来说,预设第j级链表的容量为yj比特,位图中的比特位从0开始编号。其中,j越大表示该链表越低级。
j为x时,为第x级链表,第x级链表为最底层的链表,第x级链表所包含的位图用来存储上述待存储数据,预设的待存储数据在第x级链表的位图中占用的比特位数为ox比特;
j不为x时,第j级链表所包含的位图用于存储第j+1级列表的状态,预设第j+1级列表的状态在第j级链表的位图中占用的比特位数为oj比特;
预设的链表编号规则为:第一级链表从0开始编号,每个第一级链表下的第二级链表从0开始编号,每个第二级链表下的第三级链表从0开始编号,以此类推,每个第x-1级链表下的第x级链表从0开始编号。
则:
第x级链表存储的数据个数为:px=wx=yx/ox
…
第j级链表存储的数据个数为:pj=wx*wx-1*…*wj=(yx/ox)*(yx-1/ox-1)*…*(yj/oj)
…
第一级链表存储的数据个数为:
p1=wx*wx-1*…*wj*…*w1=(yx/ox)*(yx-1/ox-1)*…*(yj/oj)*…*(y1/o1)。
对于待存储数据i(i的范围为0~n)来说,
对应的第一链表的编号为:[i/p1];
…
对应的第j级链表的编号为:[(i%p1%p2%...%pj-1)/pj];
…
对应的第x级链表的编号为:[(i%p1%p2%...%pj...%px-1)/px];
在第x级链表的位图的存储位置:从(i%px)*ox比特到(i%px)*ox+ox-1比特。
下面以两级链表为例进行说明:
假设第二级链表的容量y2为6比特,待存储数据在第二级链表中占用的比特位数o2为2比特,第二级链表存储的数据个数:p2=y2/o2=6/2=3。
假设第一级链表的容量y1为12比特,第二级链表的状态在第一级链表中占用的比特位数o1为2比特,则第一级链表对应6个第二级链表,第一级链表对应的待存储数据的个数:p1=(y2/o2)*(y1/o1)=(6/2)*(12/2)=18。
对于数据i=0来说:
对应的第一级链表的编号为:[i/p1]=[0/18]=0;
对应的第二级链表的编号为:[(i%p1)/p2]=[(0%18)/3]=[0/3]=0。
在第二级链表的位图的存储位置:
(i%p2)*o2=(0%3)*2=0;(i%p2)*o2+o2-1=(0%3)*2+2-1=1,
即编号为0和1的比特位用来存储数据i=0。
对于任意的数据i=42来说:
对应的第一级链表的编号为:[i/p1]=[42/18]=2;
对应的第二级链表的编号为:[(i%p1)/p2]=[(42%18)/3]=[6/3]=2
在第二级链表的位图的存储位置:
(i%p2)*o2=(42%3)*2=0
(i%p2)*o2+o2-1=42%3)*2+2-1=1
即编号为0和1的比特位用来存储数据i=42。
下面以三级链表为例进行说明:
第三级链表存储的数据个数:p3=y3/o3=6/3=2;
第二级链表对应的数据个数:p2=(y3/o3)*(y2/o2)=(6/3)*(12/2)=12
第一级链表对应的数据个数:
p1=(y3/o3)*(y2/o2)*(y1/o1)=(6/3)*(12/2)*(8/1)=96。
对于数据i=99来说:
对应的第一级链表的编号为:[i/p1]=[99/96]=1;
对应的第二级链表的编号为:[(i%p1)/p2]=[(99%96)/12]=[3/12]=0
在第三级链表的位图的存储位置:
(i%p3)*o3=(99%2)*3=3
(i%p3)*o3+o3-1=(99%2)*3+3-1=5
即编号为3、4、5的比特位用来存储数据。
S102:将待存储数据存储至所述存储位置。
假设待存储数据考勤正常,该待存储数据的存储位置为第一个底层链表的编号为6的比特位,将该待存储数据存储至该存储位置,即表示第一个底层链表的编号为6的比特位的位图信息为1。
S103:在目标链表包含的所述数据全部相同时,删除目标链表,并更新目标链表在上一级链表中的状态。
在上述实施例中,待存储数据在底层链表的存储位置为一个比特位组,因此,目标链表包含的所述数据全部相同,也就是说目标链表包含的每个比特位组的值全部相同,这种情况下,删除该目标链表,并在目标链表的上一级链表中将目标链表的状态更新为对应的第一预设值。
仍以待存储数据为考勤数据为例进行说明,用0表示缺勤,用1表示考勤正常,则一个比特位组中包括一个比特位。
目标链表在上一级链表中的状态可以包含三种状态:所有比特位全部为0,所有比特位全部为1,所有比特位既不全为0也不全为1。可以在目标链表的上一级链表中以两位比特位来表示目标链表的状态(因为两位比特位可以表示四种状态),比如,用01表示目标链表的所有比特位全部为1,10表示目标链表的所有比特位全部为0,00表示目标链表的所有比特位既不全为0也不全为1,当然也可以用其他方式表示底层链表的位图的状态信息,在此不做限制。
在实际应用中,可以根据有几种状态,确定上一级链表中以几位比特位来表示目标链表的状态。
当目标链表中每一比特位全为1时,在上一级链表中将目标链表的状态更新为01;当目标链表中每一比特位全为0时,在上一级链表中将目标链表的状态更新为10。
应用本发明所示实施例,在目标链表包含的存储数据全部相同时,删除了该目标链表,如果后来目标链表中的存储数据发生了改变,需要根据上一级链表中目标链表的状态,重新创建该目标链表。
在本发明所示实施例中,如果待存储数据为目标链表的第一条存储数据,则确定所述目标链表不存在,需要创建目标链表,并在上一级链表中将目标链表的状态设置为对应的初始值。在上述例子中,上一级链表中针对目标链表的初始值应该为10,表示目标链表的所有比特位全部为0。
在本发明所示实施例中,在所述目标链表包含的所述数据不全部相同时,在上一级链表中将目标链表的状态更新为对应的第二预设值。在上述例子中,在目标链表包含的所述数据不全部相同时(既包括0,又包括1),在上一级链表中将目标链表的状态更新为对应的第二预设值(00)。
在上述实施方式中,当预设了x级链表时,如果第j级链表包含的状态全部相同,则删除该第j级链表,并更新该第j级链表在第j-1级链表中的状态。
假设预设了三级链表,第三级链表中存储的是考勤数据,第三级链表存储的待存储数据的个数为2,第二级链表对应的所述待存储数据的个数为12,第一级链表对应的所述待存储数据的个数为96。也就是说第二级链表中包含了6个第三级链表,第一级链表中包含了8个第二级链表。
假设某个第三级链表中的存储的2个数据相同,都为1,则删除该第三级链表,将该第三级链表的上一级链表中的状态更新为10。假设该第三级链表的上一级链表(即第二级链表)包含的6个第三级链表中的存储的2个数据均相同,都为1,则删除这6个第三级链表,且该第二级链表中包含的状态全部相同,均为10,这种情况下,删除该第二级链表,并更新第二级链表在上一级链表中的状态。
应用本发明所示实施例,针对待存储数据,构建至少两级链表,该待存储数据存储在底层链表中,在底层链表包含的存储数据全部相同时,删除该底层链表,并更新该底层链表在上一级链表中的状态。一方面,将包含的存储数据全部相同的底层链表删除,节省了内存空间的占用;另一方面,当数据量很大、构建了多个底层链表时,如果出现数据变化的情况,仅需修改该数据对应的底层链表及该底层链表在上一级链表中的状态,不需要将全部链表进行解压-修改-压缩的处理,提高了执行效率。
下面以C语言为例来描述本发明多级链表的数据结构,需要说明的是,本发明的多级链表数据结构能够基于多种编程语言来实现,例如Python或者Java等。
作为本发明的一种实施方式,底层链表的数据结构如下:
其中,pstNextSecondBitMap表示指向下一个底层链表的指针,当已经是最后一个底层链表时,该指针为空;int类型数据iSecondBitMap表示底层链表的各个存储位置的值;每一个底层链表表示的数据范围由上一级链表中的iBeginID和该底层链表对应上一级链表的位置决定。
上一级链表的数据结构如下:
其中,pstNextFirstBitMap表示指向下一个同一级链表的指针,当该链表已经是同一级中最后一个链表时,该指针为空;int类型数据iBeginID表示该链表的第一个比特位表示的值,可以是1024的整数倍,如0、1024、2048等;long long型数据llFirstBitMap:longlong类型的数据一共64个比特位,本实施例中,用上一级链表中的每两位比特位表示一个底层链表的状态,llFirstBitMap可以表示32个底层链表的状态:当这两个比特位中左边的比特位为1时,表示对应的底层链表的所有比特位为0,当这两个比特位中右边的比特位为1时,表示对应的底层链表的所有比特位为1,当这两个比特位全为0时,表示对应的底层链表的所有比特位既不全为1,也不全为0;链表的头结点pstSecondBitMap用于指向下一级链表。
假设目标链表的上一级链表的iBeginID为2048,该上一级链表对应了32个底层链表的状态,举例说明该32个底层链表中每一个底层链表表示的数据范围:上一级链表中编号为8和9的比特位对应的底层链表表示的最小值为2048+8/2*32=2176,其中,8/2表示在编号为8和9的比特位对应的底层链表之前有4个底层链表,一共占用了8/2*32个比特位,加上初始的2048,编号为8和9的比特位对应的底层链表的数据最小值为2048+8/2*32=2176;每个底层链表占用32个比特位,编号为8和9的比特位对应的底层链表的数据最大值为2176+32–1=2207。
整体的数据结构可以如图4所示:上一级链表通过指针pstNextFirstBitMap串联成一个单链表,每一个上一级链表还记录有其对应的底层链表的链表头结点,底层链表通过pstNextSecondBitMap串联成一个单链表。
假设Z公司有2048个员工,员工ID从0到2047,在某一天有3个员工的考勤为缺勤,他们的ID分别是100、328和1530,如果采用传统的方式来记录,需要2048/8=256个BYTE的字符串来记录这一信息,在这天的考勤记录中,只需要将这个字符串的第100个、第328个和第1530个比特位全部置为0,其余位置为1即可。
采用本发明所示实施例,其处理步骤如下:
(1)获得ID为0的员工的考勤信息,该员工的考勤正常,对应的比特位应该为1。记录ID为0的员工的考勤信息时,先构建底层链表(二级结构)的上一级链表(一级结构),iBeginID的值为0,llFirstBitMap的初始值为1010101010101010101010101010101010101010101010101010101010101010(此时尚没有员工信息,全部比特位都认为是0,因此左边的比特位全部设置成1)。
(2)构建底层链表,并将底层链表的指针指向构建的上一级链表中。iSecondBitMap的初始值为00000000000000000000000000000000。
(3)ID为0的员工考勤正常,将iSecondBitMap中的编号为0的比特位设置成1,此时iSecondBitMap的值为10000000000000000000000000000000,iSecondBitMap的值既不是全1也不是全0,因此llFirstBitMap值修改成0010101010101010101010101010101010101010101010101010101010101010,ID为0的员工考勤记录完毕。
(4)在本实施例中,一个底层链表能表示32个员工的考勤信息,一个上一级链表能表示1024个员工的信息,因此需要2个上一级链表。
可以采用上述公式,确定待存储数据对应的第一级链表至第x-1级链表:确定的所述第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;确定的第x级链表的编号为:[(i%p1%p2%...%pj...%px-1)/px]。
对于ID为0的员工来说,i=0,对应的第二级链表的编号为:[i/p1]=[0/32]=0;
对应的第一级链表的编号为:[(i%p1)/p2]=[(0%32)/32]=[0/32]=0。
在第二级链表的存储位置:
(i%p2)*o2=(0%32)*2=0;(i%p2)*o2+o2-1=(0%32)*2+2-1=1,
即编号为0和1的比特位用来存储ID为0的员工的考勤数据。
(5)第一个底层链表对应于llFirstBitMap中的编号为0和1的比特位,llFirstBitMap中编号为0和1的比特位的值为00,表示第一个底层链表的所有比特位既不全为0也不全为1。
(6)获得ID为1的员工的考勤信息,该员工的考勤正常,对应的比特位应该为1。将iSecondBitMap的值修改为11000000000000000000000000000000,iSecondBitMap仍旧既不全为0也不全为1,因此不用修改。
ID从2到30的员工的处理过程与ID为1的员工的处理过程相同,经过处理完这些员工之后,iSecondBitMap变为11111111111111111111111111111110。
(7)记录ID为31的员工的考勤,ID为31的员工仍对应编号为0的底层链表。将编号为31的比特位置为1,iSecondBitMap的值变为11111111111111111111111111111111,可以看到此时iSecondBitMap所有比特位已经全部成了1,因此删除该底层链表,同时将llFirstBitMap值修改成0110101010101010101010101010101010101010101010101010101010101010。
(8)记录ID32-63员工的考勤信息,确定ID32-63员工对应的第二级链表的编号为:[i/p1]=[32/32]=1;对应的第一级链表的编号为:[(i%p1)/p2]=[(32%32)/32]=[1/32]=0。在编号为1的底层链表中记录ID32-63员工的考勤信息,其过程与记录ID0-31员工的考勤信息相同,记录完ID32-63员工的考勤信息后,llFirstBitMap值修改成0101101010101010101010101010101010101010101010101010101010101010。
为了简化描述,ID从32到99的员工的记录过程不再赘述,直接看第一个考勤异常的员工的处理方法。记录完ID为99的员工后,llFirstBitMap值为0101010010101010101010101010101010101010101010101010101010101010,iSecondBitMap值为11110000000000000000000000000000。
(9)确定ID为100的员工对应的第二级链表的编号为:[i/p1]=[100/32]=3;对应的第一级链表的编号为:[(i%p1)/p2]=[(100%32)/32]=[3/32]=0。在第二级链表的存储位置:(i%p2)*o2=(100%32)*2=6;(i%p2)*o2+o2-1=(100%32)*2+2-1=7。可知,ID为100的员工对应编号为3的底层链表,在编号为3的底层链表中,以编号为6和7的比特位用来存储ID为100的员工的考勤数据。编号为3的底层链表中存储ID为100的员工的存储位置处的位图信息本身为0,不需要进行任何操作。
(10)记录完ID为100的员工之后,继续记录后续员工,当记录完ID96-127的员工之后,此时因为员工100对应的比特位是0,员工96、97、98等对应的比特位是1,因此该编号为3的底层链表中包含的存储数据不全部相同,不删除该底层链表。记录完ID为127的员工后,llFirstBitMap值为0101010010101010101010101010101010101010101010101010101010101010,iSecondBitMap值为11110111111111111111111111111111。
(11)后续员工的处理过程相同,此处不再赘述,最终,我们得到数据结构如图5所示,存储数据全部相同的底层链表已被压缩,只显示了存储数据不全部相同的三个底层链表。
通过上述步骤可知,应用上述实施例,一共使用了两个上一级链表(一级结构)和三个底层链表(二级结构)。在32位***中,一个上一级链表的大小为(4+4+8+4)=20BYTE,一个底层链表的大小为(4+4)=8BYTE,一共占用的内存为(2*20+3*8)=64BYTE。相对于原来的256BYTE,节省了(256-64)/256=75%的内存。
作为本发明的另一种实施方式,上述方案还可以应用在BGP(Border GatewayProtocol,边界网关协议)中。在BGP应用中,需要记录每个BGP邻居是否发送过更新或者撤销的信息,以避免重复发送。
假设需要记录1000个BGP邻居是否发送过更新或者撤销的信息,针对每个邻居,有一个唯一的编号,1000个邻居的编号可以为0-999。与上述考勤数据类似,如果对于某条更新或者撤销的信息,该邻居发送过,则该邻居的存储数据为1,如果没发送过,该邻居的存储数据为0。
假设编号为100、328和930的邻居没有发送过该信息,如果采用传统的方式来记录,需要1000/8=125个BYTE的字符串来记录这一信息。在针对该信息的记录中,只需要将这个字符串的编号为100、328、930的比特位全部置为0,其余位置为1即可。
采用本发明所示实施例,应用图4中的数据结构,其处理步骤如下:
(1)获得编号为0的邻居的存储数据,该邻居发送过该信息,对应的比特位的值应该为1。记录编号为0的邻居的存储数据时,先构建底层链表(二级结构)的上一级链表(一级结构),iBeginID的值为0,llFirstBitMap的初始值为1010101010101010101010101010101010101010101010101010101010101010(此时尚没有存储数据,全部比特位都认为是0,因此左边的比特位全部设置成1)。
(2)构建底层链表,并将底层链表的指针指向构建的上一级链表中。iSecondBitMap的初始值为00000000000000000000000000000000。
(3)编号为0的邻居发送过该信息,将iSecondBitMap中的编号为0的比特位设置成1,此时iSecondBitMap的值为10000000000000000000000000000000,iSecondBitMap的值既不是全1也不是全0,因此llFirstBitMap值修改成0010101010101010101010101010101010101010101010101010101010101010,编号为0的邻居记录完毕。
(4)在本实施例中,一个底层链表能表示32个邻居的存储数据,一个上一级链表能表示1024个邻居的存储数据,因此需要1个上一级链表。
可以采用上述公式,确定待存储数据对应的第一级链表至第x-1级链表:确定的所述第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;确定的第x级链表的编号为:[(i%p1%p2%...%pj...%px-1)/px]。
对于编号为0的邻居来说,i=0,对应的第二级链表的编号为:[i/p1]=[0/32]=0;
对应的第一级链表的编号为:[(i%p1)/p2]=[(0%32)/32]=[0/32]=0。
在第二级链表的存储位置:
(i%p2)*o2=(0%32)*2=0;(i%p2)*o2+o2-1=(0%32)*2+2-1=1,
即编号为0和1的比特位用来存储编号为0的邻居的存储数据。
(5)第一个底层链表对应于llFirstBitMap中的编号为0和1的比特位,llFirstBitMap中编号为0和1的比特位的值为00,表示第一个底层链表的所有比特位既不全为0也不全为1。
(6)获得编号为1的邻居的存储数据,该邻居发送过该信息,对应的比特位应该为1。将iSecondBitMap的值修改为11000000000000000000000000000000,iSecondBitMap仍旧既不全为0也不全为1,因此不用修改。
编号从2到30的邻居的处理过程与编号为1的员工的处理过程相同,经过处理完这些员工之后,iSecondBitMap变为11111111111111111111111111111110。
(7)记录编号为31的邻居的存储数据,编号为31的邻居仍对应编号为0的底层链表。将编号为31的比特位置为1,iSecondBitMap的值变为11111111111111111111111111111111,可以看到此时iSecondBitMap所有比特位已经全部成了1,因此删除该底层链表,同时将llFirstBitMap值修改成0110101010101010101010101010101010101010101010101010101010101010。
(8)记录编号为32-63邻居的存储数据,确定编号为32-63的邻居对应的第二级链表的编号为:[i/p1]=[32/32]=1;对应的第一级链表的编号为:[(i%p1)/p2]=[(32%32)/32]=[1/32]=0。在编号为1的底层链表中记录编号为32-63的邻居的存储数据,其过程与记录编号为32-63的邻居的存储数据相同,记录完编号为32-63的邻居的存储数据后,llFirstBitMap值修改成0101101010101010101010101010101010101010101010101010101010101010。
为了简化描述,编号从32到99的邻居的记录过程不再赘述,直接看第一个异常的邻居的处理方法。记录完编号为99的邻居后,llFirstBitMap值为0101010010101010101010101010101010101010101010101010101010101010,iSecondBitMap值为11110000000000000000000000000000。
(9)确定编号为100的邻居对应的第二级链表的编号为:[i/p1]=[100/32]=3;对应的第一级链表的编号为:[(i%p1)/p2]=[(100%32)/32]=[3/32]=0。在第二级链表的存储位置:(i%p2)*o2=(100%32)*2=6;(i%p2)*o2+o2-1=(100%32)*2+2-1=7。可知,编号为100的员工对应编号为3的底层链表,在编号为3的底层链表中,以编号为6和7的比特位用来存储编号为100的邻居的存储数据。编号为3的底层链表中编号为100的邻居的存储位置处的位图信息本身为0,不需要进行任何操作。
(10)记录完编号为100的邻居之后,继续记录后续邻居,当记录完编号96-127的邻居之后,此时因为编号为100的邻居对应的比特位是0,编号为96、97、98等邻居对应的比特位是1,因此该编号为3的底层链表中包含的存储数据不全部相同,不删除该底层链表。记录完编号为127的邻居后,llFirstBitMap值0101010010101010101010101010101010101010101010101010101010101010,iSecondBitMap值为11110111111111111111111111111111。
(11)后续邻居的处理过程相同,此处不再赘述,最终存储数据全部相同的底层链表已被删除,只保留了存储数据不全部相同的三个底层链表(编号为编号为100、328和930的邻居对应的底层链表)。
通过上述步骤可知,应用上述实施例,一共使用了一个上一级链表(一级结构)和三个底层链表(二级结构)。在32位***中,一个上一级链表的大小为(4+4+8+4)=20BYTE,一个底层链表的大小为(4+4)=8BYTE,一共占用的内存为(20+3*8)=44BYTE。相对于原来的125BYTE,节省了(125-44)/125=64.8%的内存。
与上述的方法实施例相对应,本发明实施例还提供一种数据存储装置。
图6为本发明实施例提供的一种数据存储装置的结构示意图,包括:
获得确定模块201,用于获得待存储数据,并确定所述待存储数据对应的目标链表以及所述待存储数据在所述目标链表的存储位置;
存储模块202,用于将所述待存储数据存储至所述存储位置;
删除更新模块203,用于在所述目标链表包含的所述数据全部相同时,删除所述目标链表,并更新所述目标链表在上一级链表中的状态。
在本发明所示实施例中,获得确定模块201,还可以用于预设x级链表,所述x为大于1的整数,设定所述目标链表为第x级链表;以及依次确定所述待存储数据对应的第一级链表至第x-1级链表。
在本发明所示实施例中,获得确定模块201,还可以用于确定的所述第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;以及确定的第x级链表的编号为:[(i%p1%p2%...%pj...%px-1)/px];
其中,所述i为待存储数据的编号,i为非负整数;
所述pj为第j级链表对应的所述待存储数据的个数,pj=wx*wx-1*…*wj,所述wj为预设的第j级链表存储的状态的个数,wj=yj/oj,所述yj为预设的第j级链表的容量,单位为比特,所述oj为预设的第j+1级链表的状态在第j级链表中占用的比特位数;
所述px为第x级链表存储的所述待存储数据的个数,px=wx=yx/ox,所述yx为预设的第x级链表的容量,单位为比特,所述ox为预设的待存储数据在第x级链表中占用的比特位数。
在本发明所示实施例中,所述待存储数据在所述第x级链表的存储位置为一个比特位组,所述比特位组包括:从编号为(i%px)*ox的比特位到编号为(i%px)*ox+ox-1的比特位。
在本发明所示实施例中,删除更新模块203,还可以用于在所述目标链表包含的所述数据全部相同时,在所述上一级链表中将目标链表的状态更新为对应的第一预设值;以及在所述目标链表包含的所述数据不全部相同时,在所述上一级链表中将目标链表的状态更新为对应的第二预设值;
获得确定模块201,还可以用于确定所述目标链表不存在时,创建目标链表,并在所述上一级链表中将目标链表的状态设置为对应的初始值。
在本发明所示实施例中,删除更新模块203,还可以用于当第j级链表包含的状态全部相同时,删除所述第j级链表,并更新所述第j级链表在第j-1级链表中的状态。
应用本发明图6所示实施例,针对待存储数据,构建至少两级链表,该待存储数据存储在底层链表中,在底层链表包含的存储数据全部相同时,删除该底层链表,并更新该底层链表在上一级链表中的状态。一方面,将包含的存储数据全部相同的底层链表删除,节省了内存空间的占用;另一方面,当数据量很大、构建了多个底层链表时,如果出现数据变化的情况,仅需修改该数据对应的底层链表及该底层链表在上一级链表中的状态,不需要将全部链表进行解压-修改-压缩的处理,提高了执行效率。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (12)
1.一种数据存储方法,其特征在于,包括:
获得待存储数据,并确定所述待存储数据对应的目标链表以及所述待存储数据在所述目标链表的存储位置;
将所述待存储数据存储至所述存储位置;
在所述目标链表包含的所述数据全部相同时,删除所述目标链表,并更新所述目标链表在上一级链表中的状态。
2.根据权利要求1所述的方法,其特征在于,
预设x级链表,所述x为大于1的整数,则所述确定的目标链表为第x级链表,确定的所述存储位置为:在所述第x级链表的存储位置;
确定所述目标链表之前,该方法还包括:依次确定所述待存储数据对应的第一级链表至第x-1级链表。
3.根据权利要求2所述的方法,其特征在于,
确定的所述第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;
确定的第x级链表的编号为:[(i%p1%p2%...%pj…%px-1)/px];
所述i为待存储数据的编号,i为非负整数;
所述pj为第j级链表对应的所述待存储数据的个数,pj=wx*wx-1*…*wj,所述wj=yj/oj,所述yj为预设的第j级链表的容量,单位为比特,所述oj为预设的第j+1级链表的状态在第j级链表中占用的比特位数;
所述px为第x级链表存储的所述待存储数据的个数,px=wx=yx/ox,所述yx为预设的第x级链表的容量,单位为比特,所述ox为预设的待存储数据在第x级链表中占用的比特位数。
4.根据权利要求3所述的方法,其特征在于,所述待存储数据在所述第x级链表的存储位置为一个比特位组,所述比特位组包括:从编号为(i%px)*ox的比特位到编号为(i%px)*ox+ox-1的比特位。
5.根据权利要求4所述的方法,其特征在于,
在所述目标链表包含的所述数据全部相同时,所述更新所述目标链表在上一级链表中的状态,包括:在所述目标链表包含的每个比特位组的值全部相同时,在所述上一级链表中将目标链表的状态更新为对应的第一预设值;
确定所述目标链表不存在时,该方法还包括:创建目标链表,并在所述上一级链表中将目标链表的状态设置为对应的初始值;
在所述目标链表包含的所述数据不全部相同时,该方法还包括:在所述上一级链表中将目标链表的状态更新为对应的第二预设值。
6.根据权利要求3所述的方法,其特征在于,该方法还包括:当第j级链表包含的状态全部相同时,删除所述第j级链表,并更新所述第j级链表在第j-1级链表中的状态。
7.一种数据存储装置,其特征在于,包括:
获得确定模块,用于获得待存储数据,并确定所述待存储数据对应的目标链表以及所述待存储数据在所述目标链表的存储位置;
存储模块,用于将所述待存储数据存储至所述存储位置;
删除更新模块,用于在所述目标链表包含的所述数据全部相同时,删除所述目标链表,并更新所述目标链表在上一级链表中的状态。
8.根据权利要求7所述的装置,其特征在于,
所述获得确定模块,还用于预设x级链表,所述x为大于1的整数,设定所述目标链表为第x级链表;以及依次确定所述待存储数据对应的第一级链表至第x-1级链表。
9.根据权利要求8所述的装置,其特征在于,
所述获得确定模块,还用于确定的所述第一级链表至第x-1级链表的编号为:[(i%p1%p2%...%pj-1)/pj],1≤j≤x-1;以及确定的第x级链表的编号为:[(i%p1%p2%...%pj…%px-1)/px];
其中,所述i为待存储数据的编号,i为非负整数;
所述pj为第j级链表对应的所述待存储数据的个数,pj=wx*wx-1*…*wj,所述wj=yj/oj,所述yj为预设的第j级链表的容量,单位为比特,所述oj为预设的第j+1级链表的状态在第j级链表中占用的比特位数;
所述px为第x级链表存储的所述待存储数据的个数,px=wx=yx/ox,所述yx为预设的第x级链表的容量,单位为比特,所述ox为预设的待存储数据在第x级链表中占用的比特位数。
10.根据权利要求9所述的装置,其特征在于,所述待存储数据在所述第x级链表的存储位置为一个比特位组,所述比特位组包括:从编号为(i%px)*ox的比特位到编号为(i%px)*ox+ox-1的比特位。
11.根据权利要求10所述的装置,其特征在于,
所述删除更新模块,还用于在所述目标链表包含的所述数据全部相同时,在所述上一级链表中将目标链表的状态更新为对应的第一预设值;以及在所述目标链表包含的所述数据不全部相同时,在所述上一级链表中将目标链表的状态更新为对应的第二预设值;
所述获得确定模块,还用于确定所述目标链表不存在时,创建目标链表,并在所述上一级链表中将目标链表的状态设置为对应的初始值。
12.根据权利要求9所述的装置,其特征在于,
所述删除更新模块,还用于当第j级链表包含的状态全部相同时,删除所述第j级链表,并更新所述第j级链表在第j-1级链表中的状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610367629.9A CN106095788A (zh) | 2016-05-27 | 2016-05-27 | 一种数据存储方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610367629.9A CN106095788A (zh) | 2016-05-27 | 2016-05-27 | 一种数据存储方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106095788A true CN106095788A (zh) | 2016-11-09 |
Family
ID=57229334
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610367629.9A Withdrawn CN106095788A (zh) | 2016-05-27 | 2016-05-27 | 一种数据存储方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106095788A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108197885A (zh) * | 2017-11-27 | 2018-06-22 | 泰康保险集团股份有限公司 | 员工的考勤方法和装置 |
CN109274593A (zh) * | 2018-08-31 | 2019-01-25 | 新华三信息安全技术有限公司 | 一种信息存储方法及装置 |
CN109918369A (zh) * | 2017-12-13 | 2019-06-21 | 中兴通讯股份有限公司 | 数据存储方法及装置 |
CN112905606A (zh) * | 2021-05-07 | 2021-06-04 | 中建电子商务有限责任公司 | 一种基于位图的考勤标识算法 |
CN112959367A (zh) * | 2021-03-26 | 2021-06-15 | 深圳市优必选科技股份有限公司 | 一种运动部件的异常检测方法及异常检测装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1285549A (zh) * | 2000-10-23 | 2001-02-28 | 大唐电信科技股份有限公司微电子分公司 | 采用逻辑区间链表寻址的智能卡嵌入式软件的实现方法 |
CN102541623A (zh) * | 2011-12-20 | 2012-07-04 | 北京控制工程研究所 | 一种嵌入式处理器的存储空间模拟方法 |
US20130166332A1 (en) * | 2011-11-18 | 2013-06-27 | Ayman Hammad | Mobile wallet store and service injection platform apparatuses, methods and systems |
CN103970795A (zh) * | 2013-01-31 | 2014-08-06 | 杭州勒卡斯广告策划有限公司 | 一种数据处理方法、装置及*** |
-
2016
- 2016-05-27 CN CN201610367629.9A patent/CN106095788A/zh not_active Withdrawn
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1285549A (zh) * | 2000-10-23 | 2001-02-28 | 大唐电信科技股份有限公司微电子分公司 | 采用逻辑区间链表寻址的智能卡嵌入式软件的实现方法 |
US20130166332A1 (en) * | 2011-11-18 | 2013-06-27 | Ayman Hammad | Mobile wallet store and service injection platform apparatuses, methods and systems |
CN102541623A (zh) * | 2011-12-20 | 2012-07-04 | 北京控制工程研究所 | 一种嵌入式处理器的存储空间模拟方法 |
CN103970795A (zh) * | 2013-01-31 | 2014-08-06 | 杭州勒卡斯广告策划有限公司 | 一种数据处理方法、装置及*** |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108197885A (zh) * | 2017-11-27 | 2018-06-22 | 泰康保险集团股份有限公司 | 员工的考勤方法和装置 |
CN109918369A (zh) * | 2017-12-13 | 2019-06-21 | 中兴通讯股份有限公司 | 数据存储方法及装置 |
CN109918369B (zh) * | 2017-12-13 | 2024-01-23 | 金篆信科有限责任公司 | 数据存储方法及装置 |
CN109274593A (zh) * | 2018-08-31 | 2019-01-25 | 新华三信息安全技术有限公司 | 一种信息存储方法及装置 |
CN109274593B (zh) * | 2018-08-31 | 2021-06-04 | 新华三信息安全技术有限公司 | 一种信息存储方法及装置 |
CN112959367A (zh) * | 2021-03-26 | 2021-06-15 | 深圳市优必选科技股份有限公司 | 一种运动部件的异常检测方法及异常检测装置 |
CN112905606A (zh) * | 2021-05-07 | 2021-06-04 | 中建电子商务有限责任公司 | 一种基于位图的考勤标识算法 |
CN112905606B (zh) * | 2021-05-07 | 2021-08-03 | 中建电子商务有限责任公司 | 一种基于位图的考勤标识算法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106095788A (zh) | 一种数据存储方法及装置 | |
CN104040542B (zh) | 用于在易失性存储器内保持关系型数据的列向量的技术 | |
US9405790B2 (en) | System, method and data structure for fast loading, storing and access to huge data sets in real time | |
W. Grzymala-Busse | Rough set strategies to data with missing attribute values | |
Wu et al. | Steady-state genetic algorithms for discrete optimization of trusses | |
CN104040899B (zh) | 生成符号的代码字母表以便为与程序一起使用的字生成代码字 | |
CN105573962B (zh) | 单指令多数据处理器与相关方法 | |
EP0510452A2 (en) | A knowledge base management system for an information reasoning apparatus | |
CN101095284A (zh) | 用于有选择地压缩和解压缩的设备与数据方法以及压缩数据的数据格式 | |
Knjazew | OmeGA: A competent genetic algorithm for solving permutation and scheduling problems | |
CN101963944B (zh) | 对象存储方法和*** | |
CN105930390A (zh) | 关系型数据库扩展方法及关系型数据库扩展*** | |
CN107332567B (zh) | 编码方法和装置 | |
CN102236659A (zh) | 使用复杂条件从数据源进行数据过滤的方法和*** | |
CN100354861C (zh) | 数据压缩器和数据解压缩器 | |
WO1989004013A1 (en) | A relational database representation with relational database operation capability | |
Jajodia et al. | A Novel Decomposition of Multilevel Relations into Single-Level Relations. | |
Matula et al. | Two linear-time algorithms for five-coloring a planar graph | |
US6665654B2 (en) | Changing table records in a database management system | |
AS et al. | Bounding the depth of search trees | |
JPWO2008102474A1 (ja) | パターンマッチング方法及びプログラム | |
JP2007310845A (ja) | データ処理システム | |
US20050132377A1 (en) | Data processing system | |
Xiao et al. | Customer requirement information mapping method for product module configuration | |
JP2023141215A (ja) | インデックス管理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
CB02 | Change of applicant information |
Address after: 310052 Binjiang District Changhe Road, Zhejiang, China, No. 466, No. Applicant after: Xinhua three Technology Co., Ltd. Address before: 310053 Hangzhou science and Technology Industrial Park, high tech Industrial Development Zone, Zhejiang Province, No. six and road, No. 310 Applicant before: Huasan Communication Technology Co., Ltd. |
|
CB02 | Change of applicant information | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20161109 |
|
WW01 | Invention patent application withdrawn after publication |