CN104657362A - 数据存储、查询方法和装置 - Google Patents
数据存储、查询方法和装置 Download PDFInfo
- Publication number
- CN104657362A CN104657362A CN201310577254.5A CN201310577254A CN104657362A CN 104657362 A CN104657362 A CN 104657362A CN 201310577254 A CN201310577254 A CN 201310577254A CN 104657362 A CN104657362 A CN 104657362A
- Authority
- CN
- China
- Prior art keywords
- data
- content
- packed
- bucket
- cell
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0608—Saving storage space on storage systems
-
- 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/901—Indexing; Data structures therefor; Storage structures
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/0644—Management of space entities, e.g. partitions, extents, pools
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Human Computer Interaction (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明提供了一种数据存储方法,待存储数据包括原始数据标识和与所述原始数据标识对应的原始数据内容,所述方法包括:根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识;将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识;根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区。本发明提供的数据存储方法,极大地提高了数据的使用效率。本发明还提供了一种数据存储装置、一种数据查询方法和一种数据查询装置。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种数据存储、查询方法和装置。
背景技术
随着计算机技术的进步,计算机技术对人们的生活、工作产生了极大的影响,产生了大量的数据需要计算机存储和处理。目前,计算机所要存储的数据已经由原来的MB(兆字节)、GB(千兆字节)数量级,上升到了TB(万亿字节)、甚至PB(千万亿字节)数量级,面对数据的***式增长,如何降低数据存储成本已成为人们急需解决的问题。
传统的降低数据存储成本的手段,一般是直接对数据进行压缩处理后存储,然而,这种牺牲了计算时间来换取地存储空间的方式,降低了数据的使用效率,比如查询数据时必须将压缩的数据全部解压缩才能使用。
发明内容
基于此,有必要针对传统的压缩数据的方法降低了数据的使用效率的问题,提供一种数据存储方法和装置、数据查询方法和装置。
一种数据存储方法,待存储数据包括原始数据标识和与所述原始数据标识对应的原始数据内容,所述方法包括:
根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识;
将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识;
根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区。
一种数据存储装置,待存储数据包括原始数据标识和与所述原始数据标识对应的原始数据内容,所述装置包括:
数据块生成模块,用于根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识;
原始数据内容压缩模块,用于将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识;
索引生成模块,用于根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区。
上述数据存储方法和装置,将待存储数据进行聚类后,每一类待存储数据分别对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识,而数据块包括索引区和数据区,数据区存储了压缩数据内容,索引区存储了根据原始数据标识和数据区中压缩数据内容的地址标识生成的索引。查询数据时,可以直接根据查询数据标识确定查询数据所在的数据块,根据数据块中的索引获得查询数据内容的地址标识,从而可以根据该地址标识从数据区中获取压缩查询数据内容,解压缩后便可获得压缩查询数据内容。既可以达到很好的压缩效果,减少存储数据所占的空间,又能快速定位数据所在位置,实现快速查询数据,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
一种数据查询方法,所述方法包括:
获取原始查询数据标识;
根据所述原始查询数据标识和预存的数据块标识确定所述原始查询数据标识所对应的数据块;
根据所述数据块的索引区中的索引,获得与所述原始查询数据标识对应的地址标识;
根据所述地址标识从所述数据块的数据区获取压缩查询数据内容,解压缩所述压缩查询数据内容,获得查询数据内容。
一种数据查询装置,所述装置包括:
原始查询数据标识获取模块,用于获取原始查询数据标识;
数据块确定模块,用于根据所述原始查询数据标识和预存的数据块标识确定所述原始查询数据标识所对应的数据块;
地址标识获取模块,用于根据所述数据块的索引区中的索引,获得与所述原始查询数据标识对应的地址标识;
查询数据内容获取模块,用于根据所述地址标识从所述数据块的数据区获取压缩查询数据内容,解压缩模块,用于解压缩所述压缩查询数据内容,获得查询数据内容。
上述数据查询方法和装置,获取原始查询数据标识后,通过该原始查询数据标识和预存的数据块标识可以确定原始查询数据标识所对应的数据块,则确定了查询数据所在的数据块,从数据块中的索引区中获得与原始查询数据标识对应的地址标识,从而根据该地址标识可以从数据块中的数据区获取压缩查询数据内容,将压缩查询数据内容解压缩便可获得查询数据内容。可快速定位数据所在位置,实现快速检索,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
附图说明
图1为一个实施例中数据存储方法的流程示意图;
图2为一个实施例中从数据块对应的待存储数据的原始数据标识中截去低位部分,获得压缩数据标识,并将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区的步骤的流程示意图;
图3为一个实施例中将数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在数据块的数据区,并获得压缩数据内容的地址标识的步骤的流程示意图;
图4为一个实施例中生成解码加速表的步骤的流程示意图;
图5为一个具体应用场景中数据块的结构框图;
图6为一个实施例中数据查询方法的流程示意图;
图7为一个实施例中截去原始查询数据标识的低位部分,获得压缩查询数据标识,获取数据块的索引区中存储的压缩查询数据标识对应的地址标识的步骤的流程示意图;
图8为一个具体应用场景中哈夫曼树和解码加速表的示意图;
图9为一个实施例中数据存储装置的结构框图;
图10为一个实施例中索引生成模块的结构框图;
图11为一个实施例中原始数据内容压缩模块的结构框图;
图12为另一个实施例中数据存储装置的结构框图;
图13为一个实施例中数据查询装置的结构框图;
图14为一个实施例中地址标识获取模块的结构框图;
图15为一个实施例中第一获取模块的结构框图;
图16为另一个实施例中第一获取模块的结构框图;
图17为一个实施例中查询数据内容获取模块的结构框图;
图18为一个实施例中能实现本发明实施例的一个计算机***的模块图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
可以理解,本发明所使用的术语“第一”、“第二”等可在本文中用于描述各种元件,但这些元件不受这些术语限制。这些术语仅用于将第一个元件与另一个元件区分。举例来说,在不脱离本发明的范围的情况下,可以将第一预设位数称为第二预设位数,且类似地,可将第二预设位数称为第一预设位数。第一预设位数和第二预设位数两者都是预设位数,但其不是同一预设位数。
除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可以单个的形式存在,也可以多个的形式存在,本发明并不对此进行限定。本发明中的步骤虽然用标号进行了排列,但并不用于限定步骤的先后次序,除非明确说明了步骤的次序或者某步骤的执行需要其他步骤作为基础,否则步骤的相对次序是可以调整的。可以理解,本文中所使用的术语“和/或”涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能的组合。
如图1所示,在一个实施例中,提供了一种数据存储方法,该方法包括:
步骤102,根据原始数据标识对待存储数据进行聚类,每一类分别对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识。
待存储数据包括原始数据标识和与原始数据标识对应的原始数据内容。“原始”表示数据原本的状态,未经压缩或其它处理。原始数据标识可以是待存储数据的键(key),可用于区分不同的待存储数据。对待存储数据进行聚类,可以将具有公共部分的原始数据标识集中存储,并将各个原始数据标识的公共部分抽取出来,不再重复存储,存储原始数据标识时可只存储非公共部分,达到对原始数据标识进行定长压缩的目的。而定长压缩后的数据依然具备随机访问的特性,便于查找。
数据块是一组或按顺序连续排列在一起的几组记录,是主存储器与输入、输出设备或外存储器之间进行传输的一个数据单位。可以将数据块存储于计算机的内存中。将待存储数据根据原始数据标识进行聚类后,每一类对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识。这样在查询数据时,可根据查询数据标识便可定位数据所在的数据块,从而达到快速查找的目的。
步骤104,将数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在数据块的数据区,并获得压缩数据内容的地址标识。
为了获得较大的压缩率,可使用变长编码对原始数据内容进行压缩。变长编码就是熵编码,它是以每个数据单元的出现概率或频率为依据的一种编码方式,让出现最多的码字符用最短的编码标识,这样尽可能的缩短了编码长度;最后的编码结果是一个二进制的数据串,哈夫曼算法就是一种典型的变长编码。
使用变长编码可以达到很高的压缩率,但由于编码长度不固定,使得压缩数据的存储地址难以通过数据结构直接预测,一般需要将所有压缩数据解压缩才能查询到所需的数据。地址标识用于标识出压缩数据内容的存储位置,在存储压缩数据内容时,获得压缩数据内容的地址标识,可便于根据该地址标识直接定位压缩数据内容,不需要将所有压缩数据都解码。
步骤106,根据数据块对应的待存储数据的原始数据标识和地址标识生成索引,并将索引存储于数据块的索引区。
根据数据块对应的待存储数据的原始数据标识和压缩数据内容的地址标识生成索引,并将该索引存储于数据块的索引区,便于根据原始数据标识获取与原始数据标识对应的压缩数据内容的地址标识,进而根据该地址标识获取压缩数据内容,从而实现快速查询数据。
上述数据存储方法,将待存储数据进行聚类后,每一类待存储数据分别对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识,而数据块包括索引区和数据区,数据区存储了压缩数据内容,索引区存储了根据原始数据标识和数据区中压缩数据内容的地址标识生成的索引。查询数据时,可以直接根据查询数据标识确定查询数据所在的数据块,根据数据块中的索引获得查询数据内容的地址标识,从而可以根据该地址标识从数据区中获取压缩查询数据内容,解压缩后便可获得压缩查询数据内容。既可以达到很好的压缩效果,减少存储数据所占的空间,又能快速定位数据所在位置,实现快速查询数据,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
在一个实施例中,步骤102包括:将待存储数据的原始数据标识中第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将低位部分作为数据块的数据块标识。
本实施例中,将第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将低位部分作为数据块的数据块标识。查询数据时,根据查询数据标识的预设位数的低位部分可判断查询数据所在的数据块,可实现快速查询。
其中第一预设位数根据需要设定,比如若用32位无符号整数表示原始数据标识,则一个原始数据标识需要用4个字节来存储,若一个原始数据标识为“0x00000200”,其中“0x”表示十六进制,则该原始数据标识的低8位为“00”,此时第一预设位数为8。这里的低8位指二进制下的低8位,相当于十六进制下的最后2位。
在一个实施例中,步骤106包括:从数据块对应的待存储数据的原始数据标识中截去低位部分,获得压缩数据标识,并将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区。
由于将第一预设位数的低位部分相同的待存储数据作为一类,于是每一类中的原始数据标识具有相同的低位部分,截去低位部分可减少在索引区中存储数据标识所需的存储空间,实现对原始数据标识的压缩,获得压缩数据标识。比如截去8位的低位部分,可以减少1个字节的存储空间。而截去的低位部分作为数据块标识,将数据块标识与压缩数据标识组合可获得原始数据标识。将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区,该压缩数据标识和地址标识的对应关系就是存储在索引区的索引。
如图2所示,在一个实施例中,从数据块对应的待存储数据的原始数据标识中截去低位部分,获得压缩数据标识,并将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区的步骤,具体包括:
步骤202,将数据块的原始数据标识中第二预设位数的高位部分相同的原始数据标识作为同一子类,每一子类的原始数据标识分别对应数据块的索引区中的每个数据桶,将高位部分作为数据桶的数据桶标识,并在数据块的索引区中存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。
其中,第一预设位数和第二预设位数的和小于等于原始数据标识的总位数。数据桶(bucket)是数据块的索引区中用于存储数据的数据结构。
具体地,将第二预设位数的高位部分相同的原始数据标识作为同一子类,并将数据块的索引区划分为多个数据桶,每一子类与每一数据桶一一对应。每一子类的原始数据标识具有相同的高位部分,可使用该高位部分作为数据桶的数据桶标识。
索引区中还需要存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系,具体地,可使用一个数组长度与数据块中数据桶的数量相同的数组来存储数据桶的桶起始存储地址,数组的下标为数据桶标识,从而实现存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。第一预设位数和第二预设位数的和不超过原始数据标识的总位数,从而保证个原始数据标识能够正常压缩。
步骤204,从数据块对应的待存储数据的原始数据标识中截去低位部分和高位部分,获得压缩数据标识,并将压缩数据标识存储在以高位部分作为数据桶标识的数据桶中。
第一预设位数在二进制下可以是8的整数倍,第二预设位数在二进制下也可以是8的整数倍。由于8位为一个字节,可以保证截去的部分是字节的整数倍,而通常一个字符需要占据一个字节的存储空间,因而可以有效减少数据存储所在空间。
从数据块对应的待存储数据的原始数据标识中截去低位部分和高位部分,对原始数据标识进行了压缩,获得压缩数据标识,并将压缩数据标识存储在以截去的高位部分作为数据桶标识的数据桶中,数据块标识、数据桶标识和压缩数据标识可以组成原始数据标识,对原始数据标识进行压缩可以节省存储空间。
步骤206,在数据块的索引区中存储与数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识。
具体地,可在数据块的索引区中存储压缩数据标识和与压缩数据对应的数据内容在数据区中的地址标识。从而可通过压缩数据标识获取数据区中存储的压缩数据内容。
本实施例中,通过在数据块的索引区开辟多个数据桶,将原始数据标识的高位部分和低位部分截去后获得压缩数据标识后,将压缩数据标识存储在数据桶中,索引区中还存储了与压缩数据标识对应的地址标识。查询数据时,可通过索引区中存储的数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系,从数据桶中获取存储的压缩数据标识,再从索引区获得压缩数据标识对应的地址标识,从而根据该地址标识从数据块的数据区获取查询数据内容。将原始数据标识压缩后存储在索引区,节省了存储空间,而且可通过索引区快速定位数据区中的压缩数据内容,保证了查询数据的效率。
在一个实施例中,压缩数据内容的地址标识为压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;则步骤206包括:在索引区中存储数据桶所对应的起始偏移量,以及数据桶中的压缩数据标识所对应的压缩数据内容的偏移量相对于起始偏移量的桶内偏移量。
本实施例中,将压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量作为压缩数据内容的地址标识。起始存储地址是指数据区中开始存储数据的存储地址,由于数据是连续存储的,获得起始存储地址和压缩数据标识对应的压缩数据内容的偏移量,便可以获得压缩数据内容的实际存储地址,即数据区中开始存储该压缩数据内容的存储地址。而通过该压缩数据标识相邻的下一个压缩数据标识对应的压缩数据内容的偏移量,可以获得该压缩数据标识对应的压缩数据内容的存储结束位置,因而不需要额外存储数据长度,占用的存储空间小。
起始偏移量是数据桶中的压缩数据标识所对应的压缩数据内容在数据区中开始存储的存储地址相对于上述起始存储地址的偏移量,桶内偏移量是指数据桶中存储的各个压缩数据内容的偏移量相对于起始偏移量的偏移量。一个压缩数据标识对应的起始偏移量和桶内偏移量的和就是该压缩数据标识的实际偏移量,该实际偏移量和起始存储地址的和就是该压缩数据标识对应的压缩数据内容的实际存储地址。本实施例中,由于存储偏移量比存储存储地址本身要节省更多的存储空间,通过存储桶内偏移量可进一步减少存储地址标识所占用的空间。
在一个实施例中,压缩数据内容的地址标识为压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;步骤206包括:在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度。
本实施例中,在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度,由于数据长度所占的存储空间比偏移量更小,可进一步地压缩数据体积。查询数据时需要获取起始偏移量和数据桶中压缩查询数据标识以前(包括自身)的所有压缩数据标识对应的数据长度。由于数据是连续存储的,数据桶中压缩查询数据标识之前(不包括自身)所有压缩数据标识对应的数据长度的和,就是压缩查询数据标识的桶内偏移量;桶内偏移量和起始偏移量的和就是压缩查询数据标识对应的压缩数据内容的存储地址,也就是开始存储压缩数据内容的地址。而通过压缩查询数据标识自身的数据长度可获得压缩数据内容的结束地址。
在一个实施例中,压缩数据标识在数据块的索引区的数据桶中按照压缩数据标识的数值大小升序或降序存储。
本实施例中,将数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储,可便于通过二分查找法快速定位压缩数据标识,从而可大幅度提高查询数据的速度。
具体地,二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜素过程是从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半,可极大地提高查询数据的效率。
如图3所示,在一个实施例中,步骤104包括:
步骤302,将待存储数据的原始数据内容划分为数据单元,获得数据单元集合,计算每个数据单元在数据单元集合中的出现频率。
数据单元的划分可以根据实际需要确定,原始数据内容本身可以作为一个数据单元,也可以将原始数据内容划分为多个数据单元。比如若数据内容为IP地址A.B.C.D,可使用4个字节表示该IP地址,每个字节分别表示A、B、C或D,可将IP地址划分为A、B、C和D四个数据单元。
步骤304,根据数据单元的出现频率,为数据单元分配数据单元编码,并根据数据单元和数据单元编码的对应关系将数据块对应的待存储数据的原始数据内容按照数据单元进行编码,获得压缩数据内容。
计算数据单元的出现频率,为出现频率高的数据单元分配较短的编码,为出现频率低的数据单元分配较长的编码,从而根据数据单元和数据单元编码的对应关系将数据块对应的待存储数据的原始数据内容按照数据单元进行变长编码,获得压缩数据内容。
步骤306,将压缩数据内容和记录数据单元和数据单元编码的对应关系的编码表存储于数据块的数据区,并获得压缩数据内容的地址标识。
将压缩数据内容和编码表存储在数据块的数据区,其中编码表记录了数据单元和数据单元编码的对应关系,查询数据时可根据该编码表对压缩数据内容进行解码,获得原始数据内容。
本实施例中,通过将待存储数据的原始数据内容划分为数据单元,根据数据单元的出现频率对原始数据内容进行变长编码后存储,可以显著减少存储原始数据标识所需存储空间,而且每个压缩数据内容都对应有地址标识,查询数据时可通过该地址标识快速定位压缩数据内容的存储地址,兼顾数据体积和查询数据的效率。
在一个实施例中,根据数据单元的出现频率,为数据单元分配数据单元编码的步骤,包括:根据数据单元的出现频率,构造哈夫曼树,根据从哈夫曼树的根节点到叶子节点的路径生成数据单元编码;该方法还包括:在数据块的数据区存储哈夫曼树。
具体地,可将各个数据单元对应哈夫曼树的叶子节点,将数据单元按照出现频率进行排序,将出现频率最低的2个叶子节点合并得到一个新的节点,该节点的出现频率为这两个数据单元的出现频率的和。排除这两个合并的叶子节点,在剩下的叶子节点和新的节点中再合并其中出现频率最低的两个节点,一直合并到哈夫曼树的根节点为止。定义哈夫曼树的节点的左子树为0,右子数1(也可以定义左子树为1,右子树为0,这里仅举例说明原理),从而根据从根节点到叶子节点的路径生成二进制的数据单元编码。可在存储压缩数据内容和编码表时,将哈夫曼树一并存储在数据块的数据区中。
使用哈夫曼树解码压缩数据内容时,可将压缩数据内容作为位流,逐位解码。具体地,按照构建哈夫曼树时的定义,从哈夫曼树的根节点开始,遇到0则转到左子节点,遇到1则转到右子节点,直到叶子节点,此时从根节点到叶子节点的二进制编码为一个数据单元编码,且该数据单元编码的长度与该叶子节点在哈夫曼树中的深度相同。从而根据编码表获得该数据单元编码对应的数据单元,再从哈夫曼树的根节点开始继续逐位解码,直至获得预设形式的数据或者解码完成。
若原始数据内容具有固定的格式,则可以设定预设形式的数据,当获得该预设形式的数据时解码结束,无需将一个完整的压缩数据内容全部解码,获得所需内容即可,可提高查询数据的效率。
本实施例中,采用哈夫曼编码对原始数据内容进行压缩,可以显著减少压缩数据内容所需的存储空间。
如图4所示,在一个实施例中,该数据存储方法还包括生成解码加速表的步骤,包括:
步骤402,根据数据长度为预设长度的数据单元编码构造解码加速表,解码加速表中的每个数据单元编码映射到哈夫曼树中与解码加速表中的数据单元编码对应的叶子节点。
一般对经过哈夫曼编码的数据进行解码,需要逐位解码,效率比较低,因此常规的解码方式在高性能查询服务中无法满足性能需求,需要构建解码加速表实现快速解码。具体地,使用数据长度为预设长度的数据单元编码构造解码加速表,并先将解码加速表中的每个数据单元编码映射到哈夫曼树中相应的叶子节点。
步骤404,将解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中长数据单元编码的前缀对应的节点。
其中,长数据单元编码为数据长度大于预设长度的数据单元编码。对于数据长度大于预设长度的长数据单元编码,则将解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中该前缀对应的节点。
步骤406,将解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中短数据单元编码对应的叶子节点。
其中,短数据单元编码为数据长度小于预设长度的数据单元编码。对于数据长度小于预设长度的短数据单元编码,则将解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中该短数据单元编码对应的叶子节点。
步骤408,将解码加速表存储到数据块的数据区。
对压缩数据内容进行解码时,从数据块的数据区获取解码加速表,可使用读取指针从压缩数据内容中取预设长度的数据,根据解码加速表映射到哈夫曼树中的一个节点,若该映射的节点为叶子节点,则该预设长度的数据为预设长度的数据单元编码,或者是短数据单元编码,可直接根据编码表获得对应的数据单元。进而将读取指针向背离压缩数据内容的起始存储地址的方向移动与该叶子节点的深度对应的距离,即移动与该叶子节点对应的数据单元编码的长度对应的距离后,继续取预设长度的数据进行解码,直至解码获得原始数据内容或原始数据内容中预设形式的部分数据。
若映射的节点为非叶子节点,则将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与预设长度对应的距离后,使用哈夫曼树从编码数据映射的节点开始逐位移动读取指针并解码直到叶子节点,获得叶子节点对应的数据单元,继续读取预设长度的数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
本实施例中,生成了解码加速表,并存储到数据块的数据区中,解码时可一次从压缩数据内容中取预设长度的数据进行解码,尽量避免了逐位解码,提高了解码的效率。
下面用一个具体应用场景来说明上述数据存储方法的原理,本应用场景以该数据存储方法应用于计算机来举例说明。待存储数据包括账号和与账号对应的IP地址,账号为原始数据标识,IP地址为原始数据内容,如下表:
账号 | IP地址 |
0000001 | 192.168.10.11 |
0000002 | 192.168.11.9 |
0000003 | 192.168.9.11 |
…… | …… |
表一待存储数据
这里使用32位无符号整数来作为账号和偏移量来进行说明。在不压缩的情况下,每个账号需要8个字节来存储,其中4个字节用来存储账号,4个字节用来存储与账号对应的数据区中压缩IP地址的偏移量。
如图5所示,首先将账号按低8位划分成256类,每类分别对应一个数据块520,则共生成256个数据块520,数据块520对应的账号的低8位(二进制下)为数据块的数据块标识。数据块520包括索引区522和数据区524。索引区522包括65536(即216)个数据桶,数据桶标识为账号的高16位,并开辟一个数组长度为65536的指针数组,来记录各个数据桶的起始位置。则每个数据桶中只需存储账号的8~15位,以达到对账号的压缩。索引区中还存储了每个数据桶的起始偏移量和数据桶中各个压缩账号对应的桶内偏移量。数据区524存储压缩IP地址,且根据索引区中数据桶的起始偏移量和压缩账号对应的桶内偏移量,可定位压缩IP地址在数据区524中的存储位置。
本应用场景中,一个数据块额外的存储开销仅为指针数组所占用的65536*4=256KB,总共存储开销为256KB*256=64MB,而压缩账号所减少的存储空间为N*3字节,其中N为账号的个数,可见账号个数越多压缩效果越明显。
如图6所示,在一个实施例中,提供了一种数据查询方法,用于查询采用上述数据存储方法存储的数据,该方法包括:
步骤602,获取原始查询数据标识。
原始查询数据标识可由用户输入,或从第三方应用程序获得,用于根据原始查询数据标识从存储的数据中查询与该原始查询数据标识对应的查询数据内容。
步骤604,根据原始查询数据标识和预存的数据块标识确定原始查询数据标识所对应的数据块。
数据块标识可以区分不同的数据块,且数据块标识根据数据标识生成,因此根据原始查询数据标识可确定与原始查询数据标识匹配的数据块标识,从而可以确定原始数据标识所对应的数据块,该数据块是存储原始查询数据标识对应的压缩查询数据内容的数据块。
步骤606,根据数据块的索引区中的索引,获得与原始查询数据标识对应的地址标识。
数据块的索引区中存储有根据数据标识和地址标识生成的索引,根据该索引,可获得与原始查询数据标识对应的地址标识。
步骤608,根据地址标识从数据块的数据区获取压缩查询数据内容,解压缩压缩查询数据内容,获得查询数据内容。
该地址标识标识出了数据块中的数据区中压缩查询数据内容的存储位置,因此根据该地址标识可从数据块的数据区中获取压缩查询数据内容,将压缩查询数据内容解码后便可获得与原始查询数据标识对应的查询数据内容。
上述数据查询方法,获取原始查询数据标识后,通过该原始查询数据标识和预存的数据块标识可以确定原始查询数据标识所对应的数据块,则确定了查询数据所在的数据块,从数据块中的索引区中获得与原始查询数据标识对应的地址标识,从而根据该地址标识可以从数据块中的数据区获取压缩查询数据内容,将压缩查询数据内容解压缩便可获得查询数据内容。可快速定位数据所在位置,实现快速检索,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
在一个实施例中,步骤604包括:确定与原始查询数据标识中第一预设位数的低位部分匹配的数据块标识对应的数据块。
具体地,存储数据时将数据标识的第一预设位数的低位部分作为数据块标识,因此在查询数据时可截取原始查询数据标识的第一预设位数的低位部分与预存的数据块标识比较,若数据块标识与该低位部分匹配,说明该数据块标识对应的数据块就是存储压缩查询数据内容的数据块。
本实施例中,使用原始查询数据标识的第一预设位数的低位部分确定存储压缩查询数据内容的数据块,计算简单,效率高。
在一个实施例中,步骤606包括:截去原始查询数据标识的低位部分,获得压缩查询数据标识,获取数据块的索引区中存储的压缩查询数据标识对应的地址标识。
具体地,数据块的索引区中存储了截去低位部分的压缩数据标识和地址标识的对应关系,查询时截去原始查询数据标识的低位部分,获得压缩查询数据标识,从而从数据块的索引区中获取与压缩查询数据标识对应的地址标识。
本实施例中,存储的是压缩后的数据标识,可以节省存储空间,而查询时只需截去原始查询数据标识的低位部分便可实现查询,不影响查询效率,兼顾了数据体积和数据使用效率。
如图7所示,在一个实施例中,截去原始查询数据标识的低位部分,获得压缩查询数据标识,获取数据块的索引区中存储的压缩查询数据标识对应的地址标识的步骤包括:
步骤702,确定与原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识。
具体地,数据块的索引区中包括多个数据桶,存储数据时将数据标识的第二预设位数的高位部分作为数据桶标识。因此查询数据时,在数据块的索引区中确定与原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识,该匹配的数据桶标识对应的数据桶就是存储压缩查询数据标识的数据桶。其中,第一预设位数和第二预设位数的和小于等于原始查询数据标识的总位数,保证查询的有效性。
步骤704,从数据块的索引区获取数据桶标识对应的数据桶在索引区中的桶起始存储地址。
存储数据时,在数据块的索引区存储了数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。因此查询数据时,可从确定的数据块的索引区中获取匹配的数据桶标识对应的数据桶在该索引区中的桶起始存储地址。获取该桶起始存储地址,便可通过访问该存储地址读取数据桶中存储的数据。
步骤706,截去原始查询数据标识的高位部分和低位部分,获得压缩查询数据标识。
本实施例中,在存储数据标识时,截去了数据标识的高位部分和低位部分获得压缩数据标识并存储。因此在查询数据时,需截去原始查询数据标识的高位部分和低位部分,获得压缩查询数据标识。
步骤708,根据数据桶在索引区中的桶起始存储地址,在数据桶中查找与压缩查询数据标识匹配的压缩数据标识。
获得数据桶在索引区中的桶起始存储地址,便可从该桶起始存储地址开始在该数据桶中查找与压缩查询数据标识匹配的压缩数据标识。此外通过与该查询数据桶相邻的下一个数据桶的桶起始存储地址可以确定该查询数据桶的结束位置,从而避免了当数据桶中不存在压缩查询数据标识时无法停止查询。
步骤710,从索引区中获取与匹配的压缩数据标识对应的地址标识。
数据块的索引区中存储了压缩数据标识和地址标识的对应关系,因此通过该匹配的压缩数据标识,可从索引区中获取与匹配的压缩数据标识对应的地址标识,该地址标识用于确定压缩查询数据内容在数据块的数据区中的存储位置。
本实施例中,存储数据时将数据标识进行压缩,可节省大量存储空间,查询数据时使用原始查询数据标识可快速确定压缩查询数据内容所在的数据块,再从该数据块的索引区获取地址标识,从而根据地址标识获取数据块的数据区中存储的压缩查询数据内容,查询速度快,无需解压缩所有压缩数据,极大地提高了数据的使用效率。
在一个实施例中,压缩数据内容的地址标识为压缩查询数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;步骤710包括:从索引区中获取数据桶所对应的起始偏移量和匹配的压缩数据标识对应的桶内偏移量;根据起始偏移量和桶内偏移量计算查询数据内容的偏移量。
本实施例中,将压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量作为压缩数据内容的地址标识。起始存储地址是指数据区中开始存储数据的存储地址,由于数据是连续存储的,获得起始存储地址和匹配的压缩数据标识对应的偏移量,便可以获得匹配的压缩数据内容的实际存储地址,也就是压缩查询数据内容的实际存储地址。而通过该匹配的压缩数据标识相邻的下一个压缩数据标识对应的压缩数据内容的偏移量,可以获得该匹配的压缩数据标识对应的压缩数据内容的存储结束位置,因而不需要额外存储数据长度,占用的存储空间小。
起始偏移量是数据桶中的压缩数据标识所对应的压缩数据内容在数据区中开始存储的存储地址相对于上述起始存储地址的偏移量,桶内偏移量是指数据桶中存储的各个压缩数据内容的偏移量相对于起始偏移量的偏移量。计算偏移量时,压缩查询数据标识对应的起始偏移量和桶内偏移量的和就是该压缩查询数据标识的实际偏移量,该实际偏移量和起始存储地址的和就是该压缩查询数据标识对应的压缩数据内容的实际存储地址。本实施例中,由于存储偏移量比存储存储地址本身要节省更多的存储空间,通过存储桶内偏移量可进一步减少存储地址标识所占用的空间,而且对查询效率影响较小。
在一个实施例中,压缩数据内容的地址标识为压缩查询数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;步骤710包括:从索引区中获取数据桶所对应的起始偏移量和数据桶中匹配的压缩数据标识以及匹配的压缩数据标识之前所有的压缩数据标识的数据长度;根据起始偏移量和获取的数据长度计算查询数据内容的偏移量。
本实施例中,在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度,由于数据长度所占的存储空间比偏移量更小,可进一步地压缩数据体积。查询数据时需要获取起始偏移量和数据桶中压缩查询数据标识以前(包括自身)的所有压缩数据标识对应的数据长度。由于数据是连续存储的,数据桶中压缩查询数据标识之前(不包括自身)所有压缩数据标识对应的数据长度的和,就是压缩查询数据标识的桶内偏移量;桶内偏移量和起始偏移量的和就是压缩查询数据标识对应的压缩数据内容的存储地址,也就是开始存储压缩数据内容的地址。而通过压缩查询数据标识自身的数据长度可获得压缩数据内容的结束地址。
本实施例中采用记录压缩数据内容的数据长度来替代桶内偏移量,可以实现更高的压缩率,占用存储空间更小,虽然与存储桶内偏移量相比,查询数据时会花费较多的时间,但当存储资源紧张时,使用记录数据长度是更优的选择。
在一个实施例中,在数据块的索引区的数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储;在数据桶中查找与压缩查询数据标识匹配的压缩数据标识的步骤包括:使用二分查找法在数据桶中查找与压缩查询数据标识匹配的压缩数据标识。
本实施例中,将数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储,可便于通过二分查找法快速定位压缩数据标识,从而可大幅度提高查询数据的速度。
具体地,二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜素过程是从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半,可极大地提高查询数据的效率。
在一个实施例中,步骤608包括:从数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据编码表将包括数据单元编码的压缩查询数据内容进行解码,获得数据单元,根据数据单元获得查询数据内容。
数据块的数据区中存储了记录数据单元和数据单元编码的对应关系的编码表,从数据区获取编码表,从而可根据该编码表将压缩查询数据内容进行解码,获得数据单元,获得的数据单元构成查询数据内容。
在一个实施例中,从数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据编码表将包括数据单元编码的压缩查询数据内容进行解码,获得数据单元,根据数据单元获得查询数据内容的步骤包括:从数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据哈夫曼树将压缩查询数据内容划分为数据单元编码,根据编码表获得与数据单元编码对应的数据单元;根据数据单元获得查询数据内容。
使用哈夫曼树解码压缩查询数据内容时,可将压缩查询数据内容作为位流,逐位解码。具体地,按照构建哈夫曼树时的定义,节点的左子树为0,右子数1,从哈夫曼树的根节点开始,遇到0则转到左子节点,遇到1则转到右子节点,直到叶子节点,此时从根节点到叶子节点的二进制编码为一个数据单元编码,且该数据单元编码的长度与该叶子节点在哈夫曼树中的深度相同。从而根据编码表获得该数据单元编码对应的数据单元,再从哈夫曼树的根节点开始继续逐位解码,直至获得预设形式的数据或者解码完成。
本实施例中,采用哈夫曼编码对原始数据内容进行压缩,可以显著减少压缩数据内容所需的存储空间。
在一个实施例中,从数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据哈夫曼树将压缩查询数据内容划分为数据单元编码,根据编码表获得与数据单元编码对应的数据单元;根据数据单元获得查询数据内容的步骤包括步骤1)~步骤4):
1)从数据区获取哈夫曼树、解码加速表与记录数据单元和数据单元编码的对应关系的编码表。
其中,解码加速表包括多个预设长度的数据单元编码,解码加速表中的每个数据单元编码映射到哈夫曼树中与解码加速表中的数据单元编码对应的叶子节点。解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中长数据单元编码的前缀对应的节点;长数据单元编码为数据长度大于预设长度的数据单元编码。解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中短数据单元编码对应的叶子节点。短数据单元编码为数据长度小于预设长度的数据单元编码。长数据单元编码为数据长度大于预设长度的数据单元编码。
2)使用读取指针从压缩查询数据内容的起始存储地址开始读取预设长度的编码数据,使用解码加速表将编码数据映射到哈夫曼树中的节点,并判断映射的节点是否为叶子节点。
3)若编码数据映射的节点为叶子节点,则根据编码表解码获得叶子节点对应的数据单元,并将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与叶子节点的深度对应的距离后,继续读取预设长度的编码数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
4)若编码数据映射的节点为非叶子节点,则将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与预设长度对应的距离后,使用哈夫曼树从编码数据映射的节点开始逐位移动读取指针并解码直到叶子节点,获得叶子节点对应的数据单元,继续读取预设长度的编码数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
举例说明,如图8所示,哈夫曼树802中非叶子节点的左子树为0,右子树为1,对于位流010010……,使用哈夫曼树802逐位解码时,遇到0左转,遇到1则右转,如图8中所示,从根节点开始,左转、右转、左转、左转、右转、左转,最终到达叶子节点,可根据编码表获得该010010对应的数据单元。
当使用解码加速表804进行解码时,解码加速表中的每个数据单元编码均为16位。使用读取指针读取16位的编码数据,使用解码加速表804将该编码数据映射到哈夫曼树802中的节点,并判断映射的节点是否为叶子节点。
若编码数据映射的节点为叶子节点,则有两种情况,即该编码数据为16位的数据单元编码,或者该16位的数据编码的前缀为长度小于16位的短数据单元编码,可根据映射的叶子节点对应的编码单元编码直接获得编码单元,并将读取指针移动该节点的深度对应的距离(比如,若该节点的深度为16,则可将读取指针移动16位,这是因为该16位数据已经解码),继续读取16位的编码数据,直至解码完成或者获得的数据单元构成了预设形式的数据时停止解码。
若编码数据映射的节点为非叶子节点,则该16位编码数据为长编码数据的前缀部分,将读取指针移动16位后,继续使用哈夫曼树802继续逐位解码,到达叶子节点时解码获得一个数据单元,此时从当前读取指针开始继续读取16位编码数据进行解码,直至解码完成或者获得的数据单元构成了预设形式的数据时停止解码。
本实施例中,生成了解码加速表,并存储到数据块的数据区中,解码时可一次从压缩数据内容中取预设长度的数据进行解码,尽量避免了逐位解码,提高了解码的效率。
如图9所示,在一个实施例中,提供了一种数据存储装置,待存储数据包括原始数据标识和与原始数据标识对应的原始数据内容,该装置包括数据块生成模块902、原始数据内容压缩模块904和索引生成模块906。
数据块生成模块902用于根据原始数据标识对待存储数据进行聚类,每一类分别对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识。
待存储数据包括原始数据标识和与原始数据标识对应的原始数据内容。“原始”表示数据原本的状态,未经压缩或其它处理。原始数据标识可以是待存储数据的键(key),可用于区分不同的待存储数据。数据块生成模块902用于对待存储数据进行聚类,可以将具有公共部分的原始数据标识集中存储,并将各个原始数据标识的公共部分抽取出来,不再重复存储,存储原始数据标识时可只存储非公共部分,达到对原始数据标识进行定长压缩的目的。而定长压缩后的数据依然具备随机访问的特性,便于查找。
将待存储数据根据原始数据标识进行聚类后,每一类对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识。这样在查询数据时,可根据查询数据标识便可定位数据所在的数据块,从而达到快速查找的目的。
原始数据内容压缩模块904用于将数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在数据块的数据区,并获得压缩数据内容的地址标识。
为了获得较大的压缩率,原始数据内容压缩模块904可用于使用变长编码对原始数据内容进行压缩。使用变长编码可以达到很高的压缩率,但由于编码长度不固定,使得压缩数据的存储地址难以通过数据结构直接预测,一般需要将所有压缩数据解压缩才能查询到所需的数据。地址标识用于标识出压缩数据内容的存储位置,在存储压缩数据内容时,获得压缩数据内容的地址标识,可便于根据该地址标识直接定位压缩数据内容,不需要将所有压缩数据都解码。
索引生成模块906用于根据数据块对应的待存储数据的原始数据标识和地址标识生成索引,并将索引存储于数据块的索引区。
索引生成模块906可用于根据数据块对应的待存储数据的原始数据标识和压缩数据内容的地址标识生成索引,并将该索引存储于数据块的索引区,便于根据原始数据标识获取与原始数据标识对应的压缩数据内容的地址标识,进而根据该地址标识获取压缩数据内容,从而实现快速查询数据。
上述数据存储装置,将待存储数据进行聚类后,每一类待存储数据分别对应一个数据块,并根据数据块对应的待存储数据的原始数据标识生成数据块标识,而数据块包括索引区和数据区,数据区存储了压缩数据内容,索引区存储了根据原始数据标识和数据区中压缩数据内容的地址标识生成的索引。查询数据时,可以直接根据查询数据标识确定查询数据所在的数据块,根据数据块中的索引获得查询数据内容的地址标识,从而可以根据该地址标识从数据区中获取压缩查询数据内容,解压缩后便可获得压缩查询数据内容。既可以达到很好的压缩效果,减少存储数据所占的空间,又能快速定位数据所在位置,实现快速查询数据,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
在一个实施例中,数据块生成模块902还用于将待存储数据的原始数据标识中第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将低位部分作为数据块的数据块标识。
本实施例中,将第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将低位部分作为数据块的数据块标识。查询数据时,根据查询数据标识的预设位数的低位部分可判断查询数据所在的数据块,可实现快速查询。
在一个实施例中,索引生成模块906还用于从数据块对应的待存储数据的原始数据标识中截去低位部分,获得压缩数据标识,并将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区。
由于将第一预设位数的低位部分相同的待存储数据作为一类,于是每一类中的原始数据标识具有相同的低位部分,截去低位部分可减少在索引区中存储数据标识所需的存储空间,实现对原始数据标识的压缩,获得压缩数据标识。比如截去8位的低位部分,可以减少1个字节的存储空间。而截去的低位部分作为数据块标识,将数据块标识与压缩数据标识组合可获得原始数据标识。将压缩数据标识和压缩数据内容的地址标识对应存储于数据块的索引区,该压缩数据标识和地址标识的对应关系就是存储在索引区的索引。
如图10所示,在一个实施例中,索引生成模块906包括数据桶生成模块906a、压缩数据标识生成模块906b和第一存储模块906c。
数据桶生成模块906a用于将数据块的原始数据标识中第二预设位数的高位部分相同的原始数据标识作为同一子类,每一子类的原始数据标识分别对应数据块的索引区中的每个数据桶,将高位部分作为数据桶的数据桶标识,并在数据块的索引区中存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。
其中,第一预设位数和第二预设位数的和小于等于原始数据标识的总位数。具体地,数据桶生成模块906a用于将第二预设位数的高位部分相同的原始数据标识作为同一子类,并将数据块的索引区划分为多个数据桶,每一子类与每一数据桶一一对应。每一子类的原始数据标识具有相同的高位部分,可使用该高位部分作为数据桶的数据桶标识。
索引区中还需要存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系,具体地,数据桶生成模块906a可用于使用一个数组长度与数据块中数据桶的数量相同的数组来存储数据桶的桶起始存储地址,数组的下标为数据桶标识,从而实现存储数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。第一预设位数和第二预设位数的和不超过原始数据标识的总位数,从而保证原始数据标识能够正常压缩。
压缩数据标识生成模块906b用于从数据块对应的待存储数据的原始数据标识中截去低位部分和高位部分,获得压缩数据标识,并将压缩数据标识存储在以高位部分作为数据桶标识的数据桶中。
第一预设位数在二进制下可以是8的整数倍,第二预设位数在二进制下也可以是8的整数倍。由于8位为一个字节,可以保证截去的部分是字节的整数倍,而通常一个字符需要占据一个字节的存储空间,因而可以有效减少数据存储所在空间。
从数据块对应的待存储数据的原始数据标识中截去低位部分和高位部分,对原始数据标识进行了压缩,获得压缩数据标识,并将压缩数据标识存储在以截去的高位部分作为数据桶标识的数据桶中,数据块标识、数据桶标识和压缩数据标识可以组成原始数据标识,对原始数据标识进行压缩可以节省存储空间。
第一存储模块906c用于在数据块的索引区中存储与数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识。
具体地,第一存储模块906c可用于在数据块的索引区中存储压缩数据标识和与压缩数据对应的数据内容在数据区中的地址标识。从而可通过压缩数据标识获取数据区中存储的压缩数据内容。
本实施例中,通过在数据块的索引区开辟多个数据桶,将原始数据标识的高位部分和低位部分截去后获得压缩数据标识后,将压缩数据标识存储在数据桶中,索引区中还存储了与压缩数据标识对应的地址标识。查询数据时,可通过索引区中存储的数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系,从数据桶中获取存储的压缩数据标识,再从索引区获得压缩数据标识对应的地址标识,从而根据该地址标识从数据块的数据区获取查询数据内容。将原始数据标识压缩后存储在索引区,节省了存储空间,而且可通过索引区快速定位数据区中的压缩数据内容,保证了查询数据的效率。
在一个实施例中,压缩数据内容的地址标识为压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;第一存储模块906c还用于在索引区中存储数据桶所对应的起始偏移量,以及数据桶中的压缩数据标识所对应的压缩数据内容的偏移量相对于起始偏移量的桶内偏移量。
本实施例中,将压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量作为压缩数据内容的地址标识。起始存储地址是指数据区中开始存储数据的存储地址,由于数据是连续存储的,获得起始存储地址和压缩数据标识对应的压缩数据内容的偏移量,便可以获得压缩数据内容的实际存储地址,即数据区中开始存储该压缩数据内容的存储地址。而通过该压缩数据标识相邻的下一个压缩数据标识对应的压缩数据内容的偏移量,可以获得该压缩数据标识对应的压缩数据内容的存储结束位置,因而不需要额外存储数据长度,占用的存储空间小。
起始偏移量是数据桶中的压缩数据标识所对应的压缩数据内容在数据区中开始存储的存储地址相对于上述起始存储地址的偏移量,桶内偏移量是指数据桶中存储的各个压缩数据内容的偏移量相对于起始偏移量的偏移量。一个压缩数据标识对应的起始偏移量和桶内偏移量的和就是该压缩数据标识的实际偏移量,该实际偏移量和起始存储地址的和就是该压缩数据标识对应的压缩数据内容的实际存储地址。本实施例中,由于存储偏移量比存储存储地址本身要节省更多的存储空间,通过存储桶内偏移量可进一步减少存储地址标识所占用的空间。
在一个实施例中,压缩数据内容的地址标识为压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量;第一存储模块906c还用于在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度。
本实施例中,在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度,由于数据长度所占的存储空间比偏移量更小,可进一步地压缩数据体积。查询数据时需要获取起始偏移量和数据桶中压缩查询数据标识以前(包括自身)的所有压缩数据标识对应的数据长度。由于数据是连续存储的,数据桶中压缩查询数据标识之前(不包括自身)所有压缩数据标识对应的数据长度的和,就是压缩查询数据标识的桶内偏移量;桶内偏移量和起始偏移量的和就是压缩查询数据标识对应的压缩数据内容的存储地址,也就是开始存储压缩数据内容的地址。而通过压缩查询数据标识自身的数据长度可获得压缩数据内容的结束地址。
在一个实施例中,压缩数据标识在数据块的索引区的数据桶中按照压缩数据标识的数值大小升序或降序存储。
本实施例中,将数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储,可便于通过二分查找法快速定位压缩数据标识,从而可大幅度提高查询数据的速度。
如图11所示,在一个实施例中,原始数据内容压缩模块904包括频率计算模块904a、压缩数据内容生成模块904b和第二存储模块904c。
频率计算模块904a用于将待存储数据的原始数据内容划分为数据单元,获得数据单元集合,计算每个数据单元在数据单元集合中的出现频率。
数据单元的划分可以根据实际需要确定,原始数据内容本身可以作为一个数据单元,也可以将原始数据内容划分为多个数据单元。
压缩数据内容生成模块904b用于根据数据单元的出现频率,为数据单元分配数据单元编码,并根据数据单元和数据单元编码的对应关系将数据块对应的待存储数据的原始数据内容按照数据单元进行编码,获得压缩数据内容。
计算数据单元的出现频率,为出现频率高的数据单元分配较短的编码,为出现频率低的数据单元分配较长的编码,从而根据数据单元和数据单元编码的对应关系将数据块对应的待存储数据的原始数据内容按照数据单元进行变长编码,获得压缩数据内容。
第二存储模块904c用于将压缩数据内容和记录数据单元和数据单元编码的对应关系的编码表存储于数据块的数据区,并获得压缩数据内容的地址标识。
将压缩数据内容和编码表存储在数据块的数据区,其中编码表记录了数据单元和数据单元编码的对应关系,查询数据时可根据该编码表对压缩数据内容进行解码,获得原始数据内容。
本实施例中,通过将待存储数据的原始数据内容划分为数据单元,根据数据单元的出现频率对原始数据内容进行变长编码后存储,可以显著减少存储原始数据标识所需存储空间,而且每个压缩数据内容都对应有地址标识,查询数据时可通过该地址标识快速定位压缩数据内容的存储地址,兼顾数据体积和查询数据的效率。
在一个实施例中,压缩数据内容生成模块904b还用于根据数据单元的出现频率,构造哈夫曼树,根据从哈夫曼树的根节点到叶子节点的路径生成数据单元编码;第二存储模块904c还用于在数据块的数据区存储哈夫曼树。
具体地,压缩数据内容生成模块904b可用于将各个数据单元对应哈夫曼树的叶子节点,将数据单元按照出现频率进行排序,将出现频率最低的2个叶子节点合并得到一个新的节点,该节点的出现频率为这两个数据单元的出现频率的和。排除这两个合并的叶子节点,在剩下的叶子节点和新的节点中再合并其中出现频率最低的两个节点,一直合并到哈夫曼树的根节点为止。定义哈夫曼树的节点的左子树为0,右子数1(也可以定义左子树为1,右子树为0,这里仅举例说明原理),从而根据从根节点到叶子节点的路径生成二进制的数据单元编码。可在存储压缩数据内容和编码表时,将哈夫曼树一并存储在数据块的数据区中。
使用哈夫曼树解码压缩数据内容时,可将压缩数据内容作为位流,逐位解码。具体地,按照构建哈夫曼树时的定义,从哈夫曼树的根节点开始,遇到0则转到左子节点,遇到1则转到右子节点,直到叶子节点,此时从根节点到叶子节点的二进制编码为一个数据单元编码,且该数据单元编码的长度与该叶子节点在哈夫曼树中的深度相同。从而根据编码表获得该数据单元编码对应的数据单元,再从哈夫曼树的根节点开始继续逐位解码,直至获得预设形式的数据或者解码完成。
若原始数据内容具有固定的格式,则可以设定预设形式的数据,当获得该预设形式的数据时解码结束,无需将一个完整的压缩数据内容全部解码,获得所需内容即可,可提高查询数据的效率。
本实施例中,采用哈夫曼编码对原始数据内容进行压缩,可以显著减少压缩数据内容所需的存储空间。
如图12所示,在一个实施例中,装置还包括解码加速表生成模块905,包括第一映射模块905a、第二映射模块905b、第三映射模块905c和第三映存储块905d。
第一映射模块905a用于根据数据长度为预设长度的数据单元编码构造解码加速表,解码加速表中的每个数据单元编码映射到哈夫曼树中与解码加速表中的数据单元编码对应的叶子节点。
一般对经过哈夫曼编码的数据进行解码,需要逐位解码,效率比较低,因此常规的解码方式在高性能查询服务中无法满足性能需求,需要构建解码加速表实现快速解码。具体地,使用数据长度为预设长度的数据单元编码构造解码加速表,并先将解码加速表中的每个数据单元编码映射到哈夫曼树中相应的叶子节点。
第二映射模块905b用于将解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中长数据单元编码的前缀对应的节点;长数据单元编码为数据长度大于预设长度的数据单元编码。
对于数据长度大于预设长度的长数据单元编码,则将解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中该前缀对应的节点。
第三映射模块905c用于将解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中短数据单元编码对应的叶子节点;短数据单元编码为数据长度小于预设长度的数据单元编码。
对于数据长度小于预设长度的短数据单元编码,则将解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中该短数据单元编码对应的叶子节点。
第三映存储块905d用于将解码加速表存储到数据块的数据区。
对压缩数据内容进行解码时,从数据块的数据区获取解码加速表,可使用读取指针从压缩数据内容中取预设长度的数据,根据解码加速表映射到哈夫曼树中的一个节点,若该映射的节点为叶子节点,则该预设长度的数据为预设长度的数据单元编码,或者是短数据单元编码,可直接根据编码表获得对应的数据单元。进而将读取指针向背离压缩数据内容的起始存储地址的方向移动与该叶子节点的深度对应的距离,即移动与该叶子节点对应的数据单元编码的长度对应的距离后,继续取预设长度的数据进行解码,直至解码获得原始数据内容或原始数据内容中预设形式的部分数据。
若映射的节点为非叶子节点,则将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与预设长度对应的距离后,使用哈夫曼树从编码数据映射的节点开始逐位移动读取指针并解码直到叶子节点,获得叶子节点对应的数据单元,继续读取预设长度的数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
本实施例中,生成了解码加速表,并存储到数据块的数据区中,解码时可一次从压缩数据内容中取预设长度的数据进行解码,尽量避免了逐位解码,提高了解码的效率。
如图13所示,在一个实施例中,提供了一种数据查询装置,包括原始查询数据标识获取模块1302、数据块确定模块1304、地址标识获取模块1306和查询数据内容获取模块1308。
原始查询数据标识获取模块1302用于获取原始查询数据标识。
原始查询数据标识可由用户输入,或从第三方应用程序获得,用于根据原始查询数据标识从存储的数据中查询与该原始查询数据标识对应的查询数据内容。
数据块确定模块1304,用于根据原始查询数据标识和预存的数据块标识确定原始查询数据标识所对应的数据块。
数据块标识可以区分不同的数据块,且数据块标识根据数据标识生成,因此根据原始查询数据标识可确定与原始查询数据标识匹配的数据块标识,从而可以确定原始数据标识所对应的数据块,该数据块是存储原始查询数据标识对应的压缩查询数据内容的数据块。
地址标识获取模块1306,用于根据数据块的索引区中的索引,获得与原始查询数据标识对应的地址标识。
数据块的索引区中存储有根据数据标识和地址标识生成的索引,根据该索引,可获得与原始查询数据标识对应的地址标识。
查询数据内容获取模块1308,用于根据地址标识从数据块的数据区获取压缩查询数据内容,解压缩模块,用于解压缩压缩查询数据内容,获得查询数据内容。
该地址标识标识出了数据块中的数据区中压缩查询数据内容的存储位置,因此根据该地址标识可从数据块的数据区中获取压缩查询数据内容,将压缩查询数据内容解码后便可获得与原始查询数据标识对应的查询数据内容。
上述数据查询装置,获取原始查询数据标识后,通过该原始查询数据标识和预存的数据块标识可以确定原始查询数据标识所对应的数据块,则确定了查询数据所在的数据块,从数据块中的索引区中获得与原始查询数据标识对应的地址标识,从而根据该地址标识可以从数据块中的数据区获取压缩查询数据内容,将压缩查询数据内容解压缩便可获得查询数据内容。可快速定位数据所在位置,实现快速检索,而无需将所有压缩数据解压缩,极大地提高了数据的使用效率。
在一个实施例中,数据块确定模块1304还用于确定与原始查询数据标识中第一预设位数的低位部分匹配的数据块标识对应的数据块。
具体地,存储数据时将数据标识的第一预设位数的低位部分作为数据块标识,因此在查询数据时数据块确定模块1304可用于截取原始查询数据标识的第一预设位数的低位部分,将该低位部分与预存的数据块标识比较,若数据块标识与该低位部分匹配,说明该数据块标识对应的数据块就是存储压缩查询数据内容的数据块。
本实施例中,使用原始查询数据标识的第一预设位数的低位部分确定存储压缩查询数据内容的数据块,计算简单,效率高。
在一个实施例中,地址标识获取模块1306还用于截去原始查询数据标识的低位部分,获得压缩查询数据标识,获取数据块的索引区中存储的压缩查询数据标识对应的地址标识。
具体地,数据块的索引区中存储了截去低位部分的压缩数据标识和地址标识的对应关系,查询时截去原始查询数据标识的低位部分,获得压缩查询数据标识,从而从数据块的索引区中获取与压缩查询数据标识对应的地址标识。
本实施例中,存储的是压缩后的数据标识,可以节省存储空间,而查询时只需截去原始查询数据标识的低位部分便可实现查询,不影响查询效率,兼顾了数据体积和数据使用效率。
如图14所示,在一个实施例中,地址标识获取模块1306包括数据桶标识确定模块1306a、桶起始存储地址确定模块1306b、压缩查询数据标识获取模块1306c、查找模块1306d和第一获取模块1306e。
数据桶标识确定模块1306a用于确定与原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识。
具体地,数据块的索引区中包括多个数据桶,存储数据时将数据标识的第二预设位数的高位部分作为数据桶标识。因此查询数据时,数据桶标识确定模块1306a用于在数据块的索引区中确定与原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识,该匹配的数据桶标识对应的数据桶就是存储压缩查询数据标识的数据桶。其中,第一预设位数和第二预设位数的和小于等于原始查询数据标识的总位数,保证查询的有效性。
桶起始存储地址确定模块1306b用于从数据块的索引区获取数据桶标识对应的数据桶在索引区中的桶起始存储地址。
存储数据时,在数据块的索引区存储了数据桶标识和数据桶在索引区中的桶起始存储地址的对应关系。因此查询数据时,可从确定的数据块的索引区中获取匹配的数据桶标识对应的数据桶在该索引区中的桶起始存储地址。获取该桶起始存储地址,便可通过访问该存储地址读取数据桶中存储的数据。
压缩查询数据标识获取模块1306c用于截去原始查询数据标识的高位部分和低位部分,获得压缩查询数据标识。
本实施例中,在存储数据标识时,截去了数据标识的高位部分和低位部分获得压缩数据标识并存储。因此在查询数据时,压缩查询数据标识获取模块1306c用于截去原始查询数据标识的高位部分和低位部分,获得压缩查询数据标识。
查找模块1306d用于根据数据桶在索引区中的桶起始存储地址,在数据桶中查找与压缩查询数据标识匹配的压缩数据标识。
获得数据桶在索引区中的桶起始存储地址,便可从该桶起始存储地址开始在该数据桶中查找与压缩查询数据标识匹配的压缩数据标识。此外通过与该查询数据桶相邻的下一个数据桶的桶起始存储地址可以确定该查询数据桶的结束位置,从而避免了当数据桶中不存在压缩查询数据标识时无法停止查询。
第一获取模块1306e用于从索引区中获取与匹配的压缩数据标识对应的地址标识。
数据块的索引区中存储了压缩数据标识和地址标识的对应关系,因此通过该匹配的压缩数据标识,可从索引区中获取与匹配的压缩数据标识对应的地址标识,该地址标识用于确定压缩查询数据内容在数据块的数据区中的存储位置。
本实施例中,存储数据时将数据标识进行压缩,可节省大量存储空间,查询数据时使用原始查询数据标识可快速确定压缩查询数据内容所在的数据块,再从该数据块的索引区获取地址标识,从而根据地址标识获取数据块的数据区中存储的压缩查询数据内容,查询速度快,无需解压缩所有压缩数据,极大地提高了数据的使用效率。
在一个实施例中,压缩数据内容的地址标识为压缩查询数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量。
如图15所示,第一获取模块1306e包括第二获取模块1306e1和第一偏移量计算模块1306e2。
第二获取模块1306e1用于从索引区中获取数据桶所对应的起始偏移量和匹配的压缩数据标识对应的桶内偏移量。
第一偏移量计算模块1306e2用于根据起始偏移量和桶内偏移量计算查询数据内容的偏移量。
本实施例中,将压缩数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量作为压缩数据内容的地址标识。起始存储地址是指数据区中开始存储数据的存储地址,由于数据是连续存储的,获得起始存储地址和匹配的压缩数据标识对应的偏移量,便可以获得匹配的压缩数据内容的实际存储地址,也就是压缩查询数据内容的实际存储地址。而通过该匹配的压缩数据标识相邻的下一个压缩数据标识对应的压缩数据内容的偏移量,可以获得该匹配的压缩数据标识对应的压缩数据内容的存储结束位置,因而不需要额外存储数据长度,占用的存储空间小。
起始偏移量是数据桶中的压缩数据标识所对应的压缩数据内容在数据区中开始存储的存储地址相对于上述起始存储地址的偏移量,桶内偏移量是指数据桶中存储的各个压缩数据内容的偏移量相对于起始偏移量的偏移量。计算偏移量时,压缩查询数据标识对应的起始偏移量和桶内偏移量的和就是该压缩查询数据标识的实际偏移量,该实际偏移量和起始存储地址的和就是该压缩查询数据标识对应的压缩数据内容的实际存储地址。本实施例中,由于存储偏移量比存储存储地址本身要节省更多的存储空间,通过存储桶内偏移量可进一步减少存储地址标识所占用的空间,而且对查询效率影响较小。
在一个实施例中,压缩数据内容的地址标识为压缩查询数据内容在数据区中的存储地址相对于数据区中起始存储地址的偏移量。
如图16所示,第一获取模块1306e包括第三获取模块1306e3和第二偏移量计算模块1306e4。
第三获取模块1306e3用于从索引区中获取数据桶所对应的起始偏移量和数据桶中匹配的压缩数据标识以及匹配的压缩数据标识之前所有的压缩数据标识的数据长度;
第二偏移量计算模块1306e4用于根据起始偏移量和获取的数据长度计算查询数据内容的偏移量。
本实施例中,在索引区中存储数据桶所对应的压缩数据内容的起始偏移量,以及数据桶所对应的各个压缩数据内容的数据长度,由于数据长度所占的存储空间比偏移量更小,可进一步地压缩数据体积。查询数据时需要获取起始偏移量和数据桶中压缩查询数据标识以前(包括自身)的所有压缩数据标识对应的数据长度。由于数据是连续存储的,数据桶中压缩查询数据标识之前(不包括自身)所有压缩数据标识对应的数据长度的和,就是压缩查询数据标识的桶内偏移量;桶内偏移量和起始偏移量的和就是压缩查询数据标识对应的压缩数据内容的存储地址,也就是开始存储压缩数据内容的地址。而通过压缩查询数据标识自身的数据长度可获得压缩数据内容的结束地址。
本实施例中采用记录压缩数据内容的数据长度来替代桶内偏移量,可以实现更高的压缩率,占用存储空间更小,虽然与存储桶内偏移量相比,查询数据时会花费较多的时间,但当存储资源紧张时,使用记录数据长度是更优的选择。
在一个实施例中,在数据块的索引区的数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储;查找模块1306d还用于使用二分查找法在数据桶中查找与压缩查询数据标识匹配的压缩数据标识。
本实施例中,将数据桶中的压缩数据标识按照压缩数据标识的数值大小升序或降序存储,可便于通过二分查找法快速定位压缩数据标识,从而可大幅度提高查询数据的速度。
在一个实施例中,查询数据内容获取模块1308还用于从数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据编码表将包括数据单元编码的压缩查询数据内容进行解码,获得数据单元,根据数据单元获得查询数据内容。
数据块的数据区中存储了记录数据单元和数据单元编码的对应关系的编码表,从数据区获取编码表,从而可根据该编码表将压缩查询数据内容进行解码,获得数据单元,获得的数据单元构成查询数据内容。
在一个实施例中,查询数据内容获取模块1308还用于从数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据哈夫曼树将压缩查询数据内容划分为数据单元编码,根据编码表获得与数据单元编码对应的数据单元;根据数据单元获得查询数据内容。
使用哈夫曼树解码压缩查询数据内容时,可将压缩查询数据内容作为位流,逐位解码。具体地,按照构建哈夫曼树时的定义,节点的左子树为0,右子数1,从哈夫曼树的根节点开始,遇到0则转到左子节点,遇到1则转到右子节点,直到叶子节点,此时从根节点到叶子节点的二进制编码为一个数据单元编码,且该数据单元编码的长度与该叶子节点在哈夫曼树中的深度相同。从而根据编码表获得该数据单元编码对应的数据单元,再从哈夫曼树的根节点开始继续逐位解码,直至获得预设形式的数据或者解码完成。
本实施例中,采用哈夫曼编码对原始数据内容进行压缩,可以显著减少压缩数据内容所需的存储空间。
如图17所示,在一个实施例中,查询数据内容获取模块1308包括第四获取模块1308a、节点映射模块1308b、叶子节点处理模块1308c和非叶子节点处理模块1308d。
第四获取模块1308a用于从数据区获取哈夫曼树、解码加速表与记录数据单元和数据单元编码的对应关系的编码表。
其中,解码加速表包括多个预设长度的数据单元编码,解码加速表中的每个数据单元编码映射到哈夫曼树中与解码加速表中的数据单元编码对应的叶子节点。解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中长数据单元编码的前缀对应的节点;长数据单元编码为数据长度大于预设长度的数据单元编码。解码加速表中前缀与短数据单元编码相同的数据单元编码映射到哈夫曼树中短数据单元编码对应的叶子节点。短数据单元编码为数据长度小于预设长度的数据单元编码。长数据单元编码为数据长度大于预设长度的数据单元编码。
节点映射模块1308b用于使用读取指针从压缩查询数据内容的起始存储地址开始读取预设长度的编码数据,使用解码加速表将编码数据映射到哈夫曼树中的节点。
叶子节点处理模块1308c用于若编码数据映射的节点为叶子节点,则根据编码表解码获得叶子节点对应的数据单元,并将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与叶子节点的深度对应的距离后,继续读取预设长度的编码数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
非叶子节点处理模块1308d用于若编码数据映射的节点为非叶子节点,则将读取指针向背离压缩查询数据内容的起始存储地址的方向移动与预设长度对应的距离后,使用哈夫曼树从编码数据映射的节点开始逐位移动读取指针并解码直到叶子节点,获得叶子节点对应的数据单元,继续读取预设长度的编码数据,直至解码获得查询数据内容或查询数据内容中预设形式的部分数据。
本实施例中,生成了解码加速表,并存储到数据块的数据区中,解码时可一次从压缩数据内容中取预设长度的数据进行解码,尽量避免了逐位解码,提高了解码的效率。
图18为能实现本发明实施例的一个计算机***1000的模块图。该计算机***1000只是一个适用于本发明的计算机环境的示例,不能认为是提出了对本发明的使用范围的任何限制。计算机***1000也不能解释为需要依赖于或具有图示的示例性的计算机***1000中的一个或多个部件的组合。
图18中示出的计算机***1000是一个适合用于本发明的计算机***的例子。具有不同子***配置的其它架构也可以使用。
如图18所示,计算机***1000包括处理器1010、存储器1020和***总线1022。包括存储器1020和处理器1010在内的各种***组件连接到***总线1022上。处理器1010是一个用来通过计算机***中基本的算术和逻辑运算来执行计算机程序指令的硬件。存储器1020是一个用于临时或永久性存储计算程序或数据(例如,程序状态信息)的物理设备。***总线1020可以为以下几种类型的总线结构中的任意一种,包括存储器总线或存储控制器、外设总线和局部总线。处理器1010和存储器1020可以通过***总线1022进行数据通信。其中存储器1020包括只读存储器(ROM)或闪存(图中都未示出),以及随机存取存储器(RAM),RAM通常是指加载了操作***和应用程序的主存储器。
计算机***1000还包括显示接口1030(例如,图形处理单元)、显示设备1040(例如,液晶显示器)、音频接口1050(例如,声卡)以及音频设备1060(例如,扬声器)。显示设备1040和音频设备1060是用于体验多媒体内容的媒体设备。
计算机***1000一般包括一个存储设备1070。存储设备1070可以从多种计算机可读介质中选择,计算机可读介质是指可以通过计算机***1000访问的任何可利用的介质,包括移动的和固定的两种介质。例如,计算机可读介质包括但不限于,闪速存储器(微型SD卡),CD-ROM,数字通用光盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁存储设备,或者可用于存储所需信息并可由计算机***1000访问的任何其它介质。
计算机***1000还包括输入装置1080和输入接口1090(例如,IO控制器)。用户可以通过输入装置1080,如键盘、鼠标、显示装置1040上的触摸面板设备,输入指令和信息到计算机***1000中。输入装置1080通常是通过输入接口1090连接到***总线1022上的,但也可以通过其它接口或总线结构相连接,如通用串行总线(USB)。
计算机***1000可在网络环境中与一个或者多个网络设备进行逻辑连接。网络设备可以是个人电脑、服务器、路由器、智能电话、平板电脑或者其它公共网络节点。计算机***1000通过局域网(LAN)接口1100或者移动通信单元1110与网络设备相连接。局域网(LAN)是指在有限区域内,例如家庭、学校、计算机实验室、或者使用网络媒体的办公楼,互联组成的计算机网络。WiFi和双绞线布线以太网是最常用的构建局域网的两种技术。WiFi是一种能使计算机***1000间交换数据或通过无线电波连接到无线网络的技术。移动通信单元1110能在一个广阔的地理区域内移动的同时通过无线电通信线路接听和拨打电话。除了通话以外,移动通信单元1110也支持在提供移动数据服务的2G,3G或4G蜂窝通信***中进行互联网访问。
应当指出的是,其它包括比计算机***1000更多或更少的子***的计算机***也能适用于发明。例如,计算机***1000可以包括能在短距离内交换数据的蓝牙单元,用于照相的图像传感器,以及用于测量加速度的加速计。
如上面详细描述的,适用于本发明的计算机***1000能执行数据存储方法和/或数据查询方法的指定操作。计算机***1000通过处理器1010运行在计算机可读介质中的软件指令的形式来执行这些操作。这些软件指令可以从存储设备1070或者通过局域网接口1100从另一设备读入到存储器1020中。存储在存储器1020中的软件指令使得处理器1010执行上述的数据存储方法和/或数据查询方法。此外,通过硬件电路或者硬件电路结合软件指令也能同样实现本发明。因此,实现本发明并不限于任何特定硬件电路和软件的组合。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (40)
1.一种数据存储方法,待存储数据包括原始数据标识和与所述原始数据标识对应的原始数据内容,所述方法包括:
根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识;
将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识;
根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区。
2.根据权利要求1所述的方法,其特征在于,所述根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识,包括:
将所述待存储数据的原始数据标识中第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将所述低位部分作为所述数据块的数据块标识。
3.根据权利要求2所述的方法,其特征在于,所述根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区,包括:
从所述数据块对应的待存储数据的原始数据标识中截去所述低位部分,获得压缩数据标识,并将所述压缩数据标识和所述压缩数据内容的地址标识对应存储于所述数据块的索引区。
4.根据权利要求3所述的方法,其特征在于,所述从所述数据块对应的待存储数据的原始数据标识中截去所述低位部分,获得压缩数据标识,并将所述压缩数据标识和所述压缩数据内容的地址标识对应存储于所述数据块的索引区,包括:
将所述数据块的原始数据标识中第二预设位数的高位部分相同的原始数据标识作为同一子类,每一子类的原始数据标识分别对应所述数据块的索引区中的每个数据桶,将所述高位部分作为所述数据桶的数据桶标识,并在所述数据块的索引区中存储所述数据桶标识和所述数据桶在所述索引区中的桶起始存储地址的对应关系;
从所述数据块对应的待存储数据的原始数据标识中截去所述低位部分和所述高位部分,获得压缩数据标识,并将所述压缩数据标识存储在以所述高位部分作为数据桶标识的数据桶中;
在所述数据块的索引区中存储与所述数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识。
5.根据权利要求4所述的方法,其特征在于,所述压缩数据内容的地址标识为所述压缩数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述在所述数据块的索引区中存储与所述数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识,包括:
在所述索引区中存储所述数据桶所对应的起始偏移量,以及所述数据桶中的压缩数据标识所对应的压缩数据内容的偏移量相对于所述起始偏移量的桶内偏移量。
6.根据权利要求4所述的方法,其特征在于,所述压缩数据内容的地址标识为所述压缩数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述在所述数据块的索引区中存储与所述数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识,包括:
在所述索引区中存储所述数据桶所对应的压缩数据内容的起始偏移量,以及所述数据桶所对应的各个压缩数据内容的数据长度。
7.根据权利要求4-6任意一项所述的方法,其特征在于,所述压缩数据标识在所述数据块的索引区的数据桶中按照所述压缩数据标识的数值大小升序或降序存储。
8.根据权利要求1-6任意一项所述的方法,其特征在于,所述将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识,包括:
将所述待存储数据的原始数据内容划分为数据单元,获得数据单元集合,计算每个所述数据单元在所述数据单元集合中的出现频率;
根据所述数据单元的出现频率,为所述数据单元分配数据单元编码,并根据所述数据单元和所述数据单元编码的对应关系将所述数据块对应的待存储数据的原始数据内容按照数据单元进行编码,获得压缩数据内容;
将所述压缩数据内容和记录所述数据单元和所述数据单元编码的对应关系的编码表存储于所述数据块的数据区,并获得所述压缩数据内容的地址标识。
9.根据权利要求8所述的方法,其特征在于,所述根据所述数据单元的出现频率,为所述数据单元分配数据单元编码,包括:
根据所述数据单元的出现频率,构造哈夫曼树,根据从所述哈夫曼树的根节点到叶子节点的路径生成数据单元编码;
所述方法还包括:在所述数据块的数据区存储所述哈夫曼树。
10.根据权利要求9所述的方法,其特征在于,所述方法还包括:
根据数据长度为预设长度的数据单元编码构造解码加速表,所述解码加速表中的每个数据单元编码映射到所述哈夫曼树中与所述解码加速表中的数据单元编码对应的叶子节点;
将所述解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中所述长数据单元编码的前缀对应的节点;
将所述解码加速表中前缀与短数据单元编码相同的数据单元编码映射到所述哈夫曼树中所述短数据单元编码对应的叶子节点;
将所述解码加速表存储到所述数据块的数据区。
11.一种数据查询方法,所述方法包括:
获取原始查询数据标识;
根据所述原始查询数据标识和预存的数据块标识确定所述原始查询数据标识所对应的数据块;
根据所述数据块的索引区中的索引,获得与所述原始查询数据标识对应的地址标识;
根据所述地址标识从所述数据块的数据区获取压缩查询数据内容,解压缩所述压缩查询数据内容,获得查询数据内容。
12.根据权利要求11所述的方法,其特征在于,所述根据所述原始查询数据标识和预存的数据块标识确定所述原始查询数据标识所对应的数据块,包括:
确定与所述原始查询数据标识中第一预设位数的低位部分匹配的数据块标识对应的数据块。
13.根据权利要求12所述的方法,其特征在于,所述根据所述数据块的索引区中的索引,获得与所述原始查询数据标识对应的地址标识,包括:
截去所述原始查询数据标识的所述低位部分,获得压缩查询数据标识,获取所述数据块的索引区中存储的所述压缩查询数据标识对应的地址标识。
14.根据权利要求13所述的方法,其特征在于,所述截去所述原始查询数据标识的所述低位部分,获得压缩查询数据标识,获取所述数据块的索引区中存储的所述压缩查询数据标识对应的地址标识,包括:
确定与所述原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识;
从所述数据块的索引区获取所述数据桶标识对应的数据桶在所述索引区中的桶起始存储地址;
截去所述原始查询数据标识的所述高位部分和所述低位部分,获得压缩查询数据标识;
根据所述数据桶在所述索引区中的桶起始存储地址,在所述数据桶中查找与所述压缩查询数据标识匹配的压缩数据标识;
从所述索引区中获取与所述匹配的压缩数据标识对应的地址标识。
15.根据权利要求14所述的方法,其特征在于,所述压缩数据内容的地址标识为所述压缩查询数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述从所述索引区中获取与所述匹配的压缩数据标识对应的地址标识,包括:
从所述索引区中获取所述数据桶所对应的起始偏移量和所述匹配的压缩数据标识对应的桶内偏移量;
根据所述起始偏移量和所述桶内偏移量计算所述查询数据内容的偏移量。
16.根据权利要求14所述的方法,其特征在于,所述压缩数据内容的地址标识为所述压缩查询数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述从所述索引区中获取与所述匹配的压缩数据标识对应的地址标识,包括:
从所述索引区中获取所述数据桶所对应的起始偏移量和所述数据桶中所述匹配的压缩数据标识以及所述匹配的压缩数据标识之前所有的压缩数据标识的数据长度;
根据所述起始偏移量和所述获取的数据长度计算所述查询数据内容的偏移量。
17.根据权利要求14-16任意一项所述的方法,其特征在于,在所述数据块的索引区的数据桶中的压缩数据标识按照所述压缩数据标识的数值大小升序或降序存储;
所述在所述数据桶中查找与所述压缩查询数据标识匹配的压缩数据标识,包括:
使用二分查找法在所述数据桶中查找与所述压缩查询数据标识匹配的压缩数据标识。
18.根据权利要求11-16任意一项所述的方法,其特征在于,所述根据所述地址标识从所述数据块的数据区获取压缩查询数据内容,解压缩所述压缩查询数据内容,获得查询数据内容,包括:
从所述数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据所述编码表将包括数据单元编码的所述压缩查询数据内容进行解码,获得数据单元,根据所述数据单元获得查询数据内容。
19.根据权利要求18所述的方法,其特征在于,所述从所述数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据所述编码表将包括数据单元编码的所述压缩查询数据内容进行解码,获得数据单元,根据所述数据单元获得查询数据内容,包括:
从所述数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据所述哈夫曼树将所述压缩查询数据内容划分为数据单元编码,根据所述编码表获得与所述数据单元编码对应的数据单元;根据所述数据单元获得查询数据内容。
20.根据权利要求19所述的方法,其特征在于,所述从所述数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据所述哈夫曼树将所述压缩查询数据内容划分为数据单元编码,根据所述编码表获得与所述数据单元编码对应的数据单元;根据所述数据单元获得查询数据内容,包括:
从所述数据区获取哈夫曼树、解码加速表与记录数据单元和数据单元编码的对应关系的编码表;其中,所述解码加速表包括多个预设长度的数据单元编码,所述解码加速表中的每个数据单元编码映射到所述哈夫曼树中与所述解码加速表中的数据单元编码对应的叶子节点;所述解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中所述长数据单元编码的前缀对应的节点;所述解码加速表中前缀与短数据单元编码相同的数据单元编码映射到所述哈夫曼树中所述短数据单元编码对应的叶子节点;
使用读取指针从所述压缩查询数据内容的起始存储地址开始读取所述预设长度的编码数据,使用所述解码加速表将所述编码数据映射到所述哈夫曼树中的节点;
若所述编码数据映射的节点为叶子节点,则根据所述编码表解码获得所述叶子节点对应的数据单元,并将所述读取指针向背离所述压缩查询数据内容的起始存储地址的方向移动与所述叶子节点的深度对应的距离后,继续读取预设长度的编码数据,直至解码获得所述查询数据内容或所述查询数据内容中预设形式的部分数据;
若所述编码数据映射的节点为非叶子节点,则将所述读取指针向背离所述压缩查询数据内容的起始存储地址的方向移动与所述预设长度对应的距离后,使用所述哈夫曼树从所述编码数据映射的节点开始逐位移动所述读取指针并解码直到叶子节点,获得所述叶子节点对应的数据单元,继续读取预设长度的编码数据,直至解码获得所述查询数据内容或所述查询数据内容中预设形式的部分数据。
21.一种数据存储装置,其特征在于,待存储数据包括原始数据标识和与所述原始数据标识对应的原始数据内容,所述装置包括:
数据块生成模块,用于根据所述原始数据标识对所述待存储数据进行聚类,每一类分别对应一个数据块,并根据所述数据块对应的待存储数据的原始数据标识生成数据块标识;
原始数据内容压缩模块,用于将所述数据块对应的待存储数据的原始数据内容进行压缩,将压缩数据内容存储在所述数据块的数据区,并获得所述压缩数据内容的地址标识;
索引生成模块,用于根据所述数据块对应的待存储数据的原始数据标识和所述地址标识生成索引,并将所述索引存储于所述数据块的索引区。
22.根据权利要求21所述的装置,其特征在于,所述数据块生成模块还用于将所述待存储数据的原始数据标识中第一预设位数的低位部分相同的待存储数据作为一类,每一类分别对应一个数据块,并将所述低位部分作为所述数据块的数据块标识。
23.根据权利要求22所述的装置,其特征在于,所述索引生成模块还用于从所述数据块对应的待存储数据的原始数据标识中截去所述低位部分,获得压缩数据标识,并将所述压缩数据标识和所述压缩数据内容的地址标识对应存储于所述数据块的索引区。
24.根据权利要求23所述的装置,其特征在于,所述索引生成模块,包括:
数据桶生成模块,用于将所述数据块的原始数据标识中第二预设位数的高位部分相同的原始数据标识作为同一子类,每一子类的原始数据标识分别对应所述数据块的索引区中的每个数据桶,将所述高位部分作为所述数据桶的数据桶标识,并在所述数据块的索引区中存储所述数据桶标识和所述数据桶在所述索引区中的桶起始存储地址的对应关系;
压缩数据标识生成模块,用于从所述数据块对应的待存储数据的原始数据标识中截去所述低位部分和所述高位部分,获得压缩数据标识,并将所述压缩数据标识存储在以所述高位部分作为数据桶标识的数据桶中;
第一存储模块,用于在所述数据块的索引区中存储与所述数据桶中存储的压缩数据标识对应的压缩数据内容的地址标识。
25.根据权利要求24所述的装置,其特征在于,所述压缩数据内容的地址标识为所述压缩数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述第一存储模块包括还用于在所述索引区中存储所述数据桶所对应的起始偏移量,以及所述数据桶中的压缩数据标识所对应的压缩数据内容的偏移量相对于所述起始偏移量的桶内偏移量。
26.根据权利要求24所述的装置,其特征在于,所述压缩数据内容的地址标识为所述压缩数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述第一存储模块包括还用于在所述索引区中存储所述数据桶所对应的压缩数据内容的起始偏移量,以及所述数据桶所对应的各个压缩数据内容的数据长度。
27.根据权利要求24-26任意一项所述的装置,其特征在于,所述压缩数据标识在所述数据块的索引区的数据桶中按照所述压缩数据标识的数值大小升序或降序存储。
28.根据权利要求21-26任意一项所述的装置,其特征在于,所述原始数据内容压缩模块包括:
频率计算模块,用于将所述待存储数据的原始数据内容划分为数据单元,获得数据单元集合,计算每个所述数据单元在所述数据单元集合中的出现频率;
压缩数据内容生成模块,用于根据所述数据单元的出现频率,为所述数据单元分配数据单元编码,并根据所述数据单元和所述数据单元编码的对应关系将所述数据块对应的待存储数据的原始数据内容按照数据单元进行编码,获得压缩数据内容;
第二存储模块,用于将所述压缩数据内容和记录所述数据单元和所述数据单元编码的对应关系的编码表存储于所述数据块的数据区,并获得所述压缩数据内容的地址标识。
29.根据权利要求28所述的装置,其特征在于,所述压缩数据内容生成模块还用于根据所述数据单元的出现频率,构造哈夫曼树,根据从所述哈夫曼树的根节点到叶子节点的路径生成数据单元编码;
所述第二存储模块还用于在所述数据块的数据区存储所述哈夫曼树。
30.根据权利要求29所述的装置,其特征在于,所述装置还包括解码加速表生成模块,包括:
第一映射模块,用于根据数据长度为预设长度的数据单元编码构造解码加速表,所述解码加速表中的每个数据单元编码映射到所述哈夫曼树中与所述解码加速表中的数据单元编码对应的叶子节点;
第二映射模块,用于将所述解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中所述长数据单元编码的前缀对应的节点;
第三映射模块,用于将所述解码加速表中前缀与短数据单元编码相同的数据单元编码映射到所述哈夫曼树中所述短数据单元编码对应的叶子节点;
第三存储模块,用于将所述解码加速表存储到所述数据块的数据区。
31.一种数据查询装置,其特征在于,所述装置包括:
原始查询数据标识获取模块,用于获取原始查询数据标识;
数据块确定模块,用于根据所述原始查询数据标识和预存的数据块标识确定所述原始查询数据标识所对应的数据块;
地址标识获取模块,用于根据所述数据块的索引区中的索引,获得与所述原始查询数据标识对应的地址标识;
查询数据内容获取模块,用于根据所述地址标识从所述数据块的数据区获取压缩查询数据内容,解压缩模块,用于解压缩所述压缩查询数据内容,获得查询数据内容。
32.根据权利要求31所述的装置,其特征在于,所述数据块确定模块还用于确定与所述原始查询数据标识中第一预设位数的低位部分匹配的数据块标识对应的数据块。
33.根据权利要求32所述的装置,其特征在于,所述地址标识获取模块还用于截去所述原始查询数据标识的所述低位部分,获得压缩查询数据标识,获取所述数据块的索引区中存储的所述压缩查询数据标识对应的地址标识。
34.根据权利要求33所述的装置,其特征在于,所述地址标识获取模块包括:
数据桶标识确定模块,用于确定与所述原始查询数据标识的第二预设位数的高位部分匹配的数据桶标识;
桶起始存储地址确定模块,用于从所述数据块的索引区获取所述数据桶标识对应的数据桶在所述索引区中的桶起始存储地址;
压缩查询数据标识获取模块,用于截去所述原始查询数据标识的所述高位部分和所述低位部分,获得压缩查询数据标识;
查找模块,用于根据所述数据桶在所述索引区中的桶起始存储地址,在所述数据桶中查找与所述压缩查询数据标识匹配的压缩数据标识;
第一获取模块,用于从所述索引区中获取与所述匹配的压缩数据标识对应的地址标识。
35.根据权利要求34所述的装置,其特征在于,所述压缩数据内容的地址标识为所述压缩查询数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述第一获取模块包括:
第二获取模块,用于从所述索引区中获取所述数据桶所对应的起始偏移量和所述匹配的压缩数据标识对应的桶内偏移量;
第一偏移量计算模块,用于根据所述起始偏移量和所述桶内偏移量计算所述查询数据内容的偏移量。
36.根据权利要求34所述的装置,其特征在于,所述压缩数据内容的地址标识为所述压缩查询数据内容在所述数据区中的存储地址相对于所述数据区中起始存储地址的偏移量;
所述第一获取模块包括:
第三获取模块,用于从所述索引区中获取所述数据桶所对应的起始偏移量和所述数据桶中所述匹配的压缩数据标识以及所述匹配的压缩数据标识之前所有的压缩数据标识的数据长度;
第二偏移量计算模块,用于根据所述起始偏移量和所述获取的数据长度计算所述查询数据内容的偏移量。
37.根据权利要求34-36任意一项所述的装置,其特征在于,在所述数据块的索引区的数据桶中的压缩数据标识按照所述压缩数据标识的数值大小升序或降序存储;
所述查找模块还用于使用二分查找法在所述数据桶中查找与所述压缩查询数据标识匹配的压缩数据标识。
38.根据权利要求31-36任意一项所述的装置,其特征在于,所述查询数据内容获取模块还用于从所述数据区获取记录数据单元和数据单元编码的对应关系的编码表,根据所述编码表将包括数据单元编码的所述压缩查询数据内容进行解码,获得数据单元,根据所述数据单元获得查询数据内容。
39.根据权利要求38所述的装置,其特征在于,所述查询数据内容获取模块还用于从所述数据区获取哈夫曼树与记录数据单元和数据单元编码的对应关系的编码表;根据所述哈夫曼树将所述压缩查询数据内容划分为数据单元编码,根据所述编码表获得与所述数据单元编码对应的数据单元;根据所述数据单元获得查询数据内容。
40.根据权利要求39所述的装置,其特征在于,所述查询数据内容获取模块包括:
第四获取模块,用于从所述数据区获取哈夫曼树、解码加速表与记录数据单元和数据单元编码的对应关系的编码表;其中,所述解码加速表包括多个预设长度的数据单元编码,所述解码加速表中的每个数据单元编码映射到所述哈夫曼树中与所述解码加速表中的数据单元编码对应的叶子节点;所述解码加速表中与长数据单元编码的预设长度的前缀相同的数据单元编码映射到哈夫曼树中所述长数据单元编码的前缀对应的节点;所述解码加速表中前缀与短数据单元编码相同的数据单元编码映射到所述哈夫曼树中所述短数据单元编码对应的叶子节点;
节点映射模块,用于使用读取指针从所述压缩查询数据内容的起始存储地址开始读取所述预设长度的编码数据,使用所述解码加速表将所述编码数据映射到所述哈夫曼树中的节点;
叶子节点处理模块,用于若所述编码数据映射的节点为叶子节点,则根据所述编码表解码获得所述叶子节点对应的数据单元,并将所述读取指针向背离所述压缩查询数据内容的起始存储地址的方向移动与所述叶子节点的深度对应的距离后,继续读取预设长度的编码数据,直至解码获得所述查询数据内容或所述查询数据内容中预设形式的部分数据;
非叶子节点处理模块,用于若所述编码数据映射的节点为非叶子节点,则将所述读取指针向背离所述压缩查询数据内容的起始存储地址的方向移动与所述预设长度对应的距离后,使用所述哈夫曼树从所述编码数据映射的节点开始逐位移动所述读取指针并解码直到叶子节点,获得所述叶子节点对应的数据单元,继续读取预设长度的编码数据,直至解码获得所述查询数据内容或所述查询数据内容中预设形式的部分数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310577254.5A CN104657362B (zh) | 2013-11-18 | 2013-11-18 | 数据存储、查询方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310577254.5A CN104657362B (zh) | 2013-11-18 | 2013-11-18 | 数据存储、查询方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104657362A true CN104657362A (zh) | 2015-05-27 |
CN104657362B CN104657362B (zh) | 2018-07-10 |
Family
ID=53248510
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310577254.5A Active CN104657362B (zh) | 2013-11-18 | 2013-11-18 | 数据存储、查询方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104657362B (zh) |
Cited By (27)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105743509A (zh) * | 2016-01-26 | 2016-07-06 | 华为技术有限公司 | 数据压缩装置及方法 |
CN106202398A (zh) * | 2016-07-08 | 2016-12-07 | 北京易车互联信息技术有限公司 | 一种索引建立的方法及装置 |
CN106326464A (zh) * | 2016-08-31 | 2017-01-11 | 成都科来软件有限公司 | 一种基于检索信息投影的网络会话包索引方法 |
CN106484852A (zh) * | 2016-09-30 | 2017-03-08 | 华为技术有限公司 | 数据压缩方法、设备与计算设备 |
CN106686401A (zh) * | 2017-01-13 | 2017-05-17 | 山东鑫诚信电子科技有限公司 | 一种视频数据分布式存储与检索的方法及装置 |
CN107015985A (zh) * | 2016-01-27 | 2017-08-04 | 阿里巴巴集团控股有限公司 | 一种数据存储与获取方法及装置 |
CN107204776A (zh) * | 2016-03-18 | 2017-09-26 | 余海箭 | 一种基于浮点数情况的Web3D数据压缩算法 |
CN107944957A (zh) * | 2017-11-22 | 2018-04-20 | 广州优视网络科技有限公司 | 应用程序推送方法、装置及计算机设备 |
CN105608019B (zh) * | 2015-12-21 | 2018-06-29 | 山东海量信息技术研究院 | 一种在硬核ram快速查找数据的方法 |
CN108628898A (zh) * | 2017-03-21 | 2018-10-09 | ***通信集团河北有限公司 | 数据入库的方法、装置和设备 |
CN109145118A (zh) * | 2018-09-06 | 2019-01-04 | 北京京东尚科信息技术有限公司 | 信息管理方法和装置 |
CN110147330A (zh) * | 2019-05-23 | 2019-08-20 | 深圳市创维软件有限公司 | 一种字模数据的缓存方法、装置、设备和存储介质 |
WO2020024772A1 (zh) * | 2018-08-03 | 2020-02-06 | 华为技术有限公司 | 查询数据的方法和装置 |
CN110866127A (zh) * | 2018-08-27 | 2020-03-06 | 华为技术有限公司 | 建立索引的方法以及相关装置 |
CN110874416A (zh) * | 2018-09-04 | 2020-03-10 | 深圳云天励飞技术有限公司 | 一种图像特征值存储方法、装置和电子设备 |
CN111159202A (zh) * | 2019-12-30 | 2020-05-15 | 深信服科技股份有限公司 | 数据处理方法、虚拟装置、设备和存储介质 |
CN111190908A (zh) * | 2018-11-15 | 2020-05-22 | 华为技术有限公司 | 一种数据管理方法、装置及*** |
TWI695264B (zh) * | 2019-05-20 | 2020-06-01 | 慧榮科技股份有限公司 | 資料儲存裝置與資料處理方法 |
CN111274259A (zh) * | 2020-02-16 | 2020-06-12 | 西安奥卡云数据科技有限公司 | 一种分布式存储***中存储节点的数据更新方法 |
CN111309261A (zh) * | 2020-02-16 | 2020-06-19 | 西安奥卡云数据科技有限公司 | 一种分布式存储***中单节点上数据物理位置映射方法 |
CN111833496A (zh) * | 2020-07-17 | 2020-10-27 | 长园共创电力安全技术股份有限公司 | 基于智能钥匙的开锁方法、装置及存储介质 |
CN112486915A (zh) * | 2020-12-18 | 2021-03-12 | 上海哔哩哔哩科技有限公司 | 数据存储方法及装置 |
CN108075978B (zh) * | 2016-11-17 | 2021-03-30 | 华为技术有限公司 | 一种报文发送方法、节点配置方法以及相关设备 |
CN112584155A (zh) * | 2020-12-11 | 2021-03-30 | 南京中兴力维软件有限公司 | 一种视频数据处理方法和装置 |
CN112783418A (zh) * | 2019-11-01 | 2021-05-11 | 华为技术有限公司 | 一种存储应用程序数据的方法及移动终端 |
CN113535709A (zh) * | 2020-04-15 | 2021-10-22 | 北京字节跳动网络技术有限公司 | 数据处理方法、装置及电子设备 |
CN113852556A (zh) * | 2021-08-31 | 2021-12-28 | 天翼数字生活科技有限公司 | 一种路由信息压缩与检索方法和*** |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1858747A (zh) * | 2006-04-30 | 2006-11-08 | 北京金山软件有限公司 | 一种数据存储/检索方法及*** |
CN101676899A (zh) * | 2008-09-18 | 2010-03-24 | 上海宝信软件股份有限公司 | 海量数据库记录的归档和查询方法 |
US20100257174A1 (en) * | 2009-04-02 | 2010-10-07 | Matthew Dino Minuti | Method for data compression utilizing pattern-analysis and matching means such as neural networks |
CN102024047A (zh) * | 2010-12-14 | 2011-04-20 | 青岛普加智能信息有限公司 | 数据检索方法及装置 |
-
2013
- 2013-11-18 CN CN201310577254.5A patent/CN104657362B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1858747A (zh) * | 2006-04-30 | 2006-11-08 | 北京金山软件有限公司 | 一种数据存储/检索方法及*** |
CN101676899A (zh) * | 2008-09-18 | 2010-03-24 | 上海宝信软件股份有限公司 | 海量数据库记录的归档和查询方法 |
US20100257174A1 (en) * | 2009-04-02 | 2010-10-07 | Matthew Dino Minuti | Method for data compression utilizing pattern-analysis and matching means such as neural networks |
CN102024047A (zh) * | 2010-12-14 | 2011-04-20 | 青岛普加智能信息有限公司 | 数据检索方法及装置 |
Cited By (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105608019B (zh) * | 2015-12-21 | 2018-06-29 | 山东海量信息技术研究院 | 一种在硬核ram快速查找数据的方法 |
CN105743509B (zh) * | 2016-01-26 | 2019-05-24 | 华为技术有限公司 | 数据压缩装置及方法 |
WO2017128763A1 (zh) * | 2016-01-26 | 2017-08-03 | 华为技术有限公司 | 数据压缩装置及方法 |
CN105743509A (zh) * | 2016-01-26 | 2016-07-06 | 华为技术有限公司 | 数据压缩装置及方法 |
CN107015985A (zh) * | 2016-01-27 | 2017-08-04 | 阿里巴巴集团控股有限公司 | 一种数据存储与获取方法及装置 |
CN107204776A (zh) * | 2016-03-18 | 2017-09-26 | 余海箭 | 一种基于浮点数情况的Web3D数据压缩算法 |
CN106202398A (zh) * | 2016-07-08 | 2016-12-07 | 北京易车互联信息技术有限公司 | 一种索引建立的方法及装置 |
CN106326464A (zh) * | 2016-08-31 | 2017-01-11 | 成都科来软件有限公司 | 一种基于检索信息投影的网络会话包索引方法 |
CN106484852A (zh) * | 2016-09-30 | 2017-03-08 | 华为技术有限公司 | 数据压缩方法、设备与计算设备 |
CN106484852B (zh) * | 2016-09-30 | 2019-10-18 | 华为技术有限公司 | 数据压缩方法、设备与计算设备 |
CN108075978B (zh) * | 2016-11-17 | 2021-03-30 | 华为技术有限公司 | 一种报文发送方法、节点配置方法以及相关设备 |
CN106686401A (zh) * | 2017-01-13 | 2017-05-17 | 山东鑫诚信电子科技有限公司 | 一种视频数据分布式存储与检索的方法及装置 |
CN108628898B (zh) * | 2017-03-21 | 2021-04-23 | ***通信集团河北有限公司 | 数据入库的方法、装置和设备 |
CN108628898A (zh) * | 2017-03-21 | 2018-10-09 | ***通信集团河北有限公司 | 数据入库的方法、装置和设备 |
CN107944957A (zh) * | 2017-11-22 | 2018-04-20 | 广州优视网络科技有限公司 | 应用程序推送方法、装置及计算机设备 |
US11579986B2 (en) | 2018-08-03 | 2023-02-14 | Huawei Cloud Computing Technologies Co., Ltd. | Data query method and apparatus |
WO2020024772A1 (zh) * | 2018-08-03 | 2020-02-06 | 华为技术有限公司 | 查询数据的方法和装置 |
CN110866127A (zh) * | 2018-08-27 | 2020-03-06 | 华为技术有限公司 | 建立索引的方法以及相关装置 |
CN110874416B (zh) * | 2018-09-04 | 2022-06-24 | 深圳云天励飞技术有限公司 | 一种图像特征值存储方法、装置和电子设备 |
CN110874416A (zh) * | 2018-09-04 | 2020-03-10 | 深圳云天励飞技术有限公司 | 一种图像特征值存储方法、装置和电子设备 |
CN109145118A (zh) * | 2018-09-06 | 2019-01-04 | 北京京东尚科信息技术有限公司 | 信息管理方法和装置 |
CN111190908B (zh) * | 2018-11-15 | 2023-09-22 | 华为技术有限公司 | 一种数据管理方法、装置及*** |
CN111190908A (zh) * | 2018-11-15 | 2020-05-22 | 华为技术有限公司 | 一种数据管理方法、装置及*** |
TWI695264B (zh) * | 2019-05-20 | 2020-06-01 | 慧榮科技股份有限公司 | 資料儲存裝置與資料處理方法 |
CN110147330A (zh) * | 2019-05-23 | 2019-08-20 | 深圳市创维软件有限公司 | 一种字模数据的缓存方法、装置、设备和存储介质 |
CN110147330B (zh) * | 2019-05-23 | 2023-09-01 | 深圳市创维软件有限公司 | 一种字模数据的缓存方法、装置、设备和存储介质 |
CN112783418A (zh) * | 2019-11-01 | 2021-05-11 | 华为技术有限公司 | 一种存储应用程序数据的方法及移动终端 |
CN111159202A (zh) * | 2019-12-30 | 2020-05-15 | 深信服科技股份有限公司 | 数据处理方法、虚拟装置、设备和存储介质 |
CN111309261A (zh) * | 2020-02-16 | 2020-06-19 | 西安奥卡云数据科技有限公司 | 一种分布式存储***中单节点上数据物理位置映射方法 |
CN111274259A (zh) * | 2020-02-16 | 2020-06-12 | 西安奥卡云数据科技有限公司 | 一种分布式存储***中存储节点的数据更新方法 |
CN113535709A (zh) * | 2020-04-15 | 2021-10-22 | 北京字节跳动网络技术有限公司 | 数据处理方法、装置及电子设备 |
CN111833496A (zh) * | 2020-07-17 | 2020-10-27 | 长园共创电力安全技术股份有限公司 | 基于智能钥匙的开锁方法、装置及存储介质 |
CN112584155A (zh) * | 2020-12-11 | 2021-03-30 | 南京中兴力维软件有限公司 | 一种视频数据处理方法和装置 |
CN112486915A (zh) * | 2020-12-18 | 2021-03-12 | 上海哔哩哔哩科技有限公司 | 数据存储方法及装置 |
CN112486915B (zh) * | 2020-12-18 | 2023-01-20 | 上海哔哩哔哩科技有限公司 | 数据存储方法及装置 |
CN113852556A (zh) * | 2021-08-31 | 2021-12-28 | 天翼数字生活科技有限公司 | 一种路由信息压缩与检索方法和*** |
CN113852556B (zh) * | 2021-08-31 | 2023-04-14 | 天翼数字生活科技有限公司 | 一种路由信息压缩与检索方法和*** |
Also Published As
Publication number | Publication date |
---|---|
CN104657362B (zh) | 2018-07-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104657362A (zh) | 数据存储、查询方法和装置 | |
US8838551B2 (en) | Multi-level database compression | |
CN103326732B (zh) | 压缩数据的方法、解压数据的方法、编码器和解码器 | |
CN112953550B (zh) | 数据压缩的方法、电子设备及存储介质 | |
CN111629081B (zh) | 互联网协议ip地址数据处理方法、装置及电子设备 | |
CN116680648B (zh) | 一种数字孪生城市的业务融合数据生成方法及*** | |
CN101667843B (zh) | 嵌入式***的数据压缩、及解压缩方法与装置 | |
US8838550B1 (en) | Readable text-based compression of resource identifiers | |
CN104008134B (zh) | 基于HBase的高效存储方法及*** | |
CN1924854B (zh) | 智能移动终端的桌面搜索方法 | |
CN112118010A (zh) | 一种字符串的压缩处理方法、装置和存储介质 | |
US9665590B2 (en) | Bitmap compression for fast searches and updates | |
CN105144157A (zh) | 用于压缩数据库中的数据的***和方法 | |
KR100484137B1 (ko) | 개선된 허프만 디코딩 방법 및 장치 | |
CN109325089A (zh) | 一种非定点对象查询方法、装置、终端设备及存储介质 | |
CN101551820A (zh) | 兴趣点属性的索引数据库的生成方法和装置 | |
CN115408350A (zh) | 日志压缩、日志还原方法、装置、计算机设备和存储介质 | |
WO2024149207A1 (zh) | 数据处理方法和装置、介质和计算机设备 | |
JPWO2014097359A1 (ja) | 圧縮プログラム、圧縮装置、伸張プログラムおよび伸張装置 | |
CN111061722A (zh) | 一种数据压缩、数据解压缩方法、装置及设备 | |
CN116301656A (zh) | 基于日志结构合并树的数据存储方法、***及设备 | |
CN111767280A (zh) | 数据处理方法、装置及存储介质 | |
CN104021121A (zh) | 一种文本数据压缩方法、装置及服务器 | |
CN112506876B (zh) | 一种支持sql查询的无损压缩查询方法 | |
WO2009001174A1 (en) | System and method for data compression and storage allowing fast retrieval |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |