CN102207964A - 实时海量数据索引建立方法及系统 - Google Patents

实时海量数据索引建立方法及系统 Download PDF

Info

Publication number
CN102207964A
CN102207964A CN2011101448079A CN201110144807A CN102207964A CN 102207964 A CN102207964 A CN 102207964A CN 2011101448079 A CN2011101448079 A CN 2011101448079A CN 201110144807 A CN201110144807 A CN 201110144807A CN 102207964 A CN102207964 A CN 102207964A
Authority
CN
China
Prior art keywords
piece
sub
data
buffer zone
internal memory
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
Application number
CN2011101448079A
Other languages
English (en)
Other versions
CN102207964B (zh
Inventor
钱善海
温文全
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Telefonaktiebolaget LM Ericsson AB
Original Assignee
SNRISE Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by SNRISE Corp filed Critical SNRISE Corp
Priority to CN 201110144807 priority Critical patent/CN102207964B/zh
Publication of CN102207964A publication Critical patent/CN102207964A/zh
Application granted granted Critical
Publication of CN102207964B publication Critical patent/CN102207964B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及数据处理技术,公开了一种实时海量数据索引建立方法及系统。该方法包括:将实时产生的数据记录以追加方式写入到第一内存中;定时将所述第一内存中存储的数据写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。利用本发明,可以实现快速、高效地建立索引,满足快速查询的需求。

Description

实时海量数据索引建立方法及系统
技术领域
本发明涉及数据处理技术,具体涉及一种实时海量数据索引建立方法及系统。
背景技术
在信息时代,数据的处理在很多时候都需要按照指定的关键字查找出相关内容,例如,通过搜索引擎,只要输入关键字,即可查询得到与该关键字相关的内容。再例如,对数据库进行查询,可以按照某个字段查询得到该字段的全部数据。传统数据库的查询是通过在数据库中建立的索引来完成的。
在某些应用环境下,需要记录的数据量是实时变化的,针对这种情况,通常的做法是建立不同粒度的索引,比如,每分钟建立一次“分钟索引数据”,每小时将所有“分钟索引数据”重新处理,建立“小时索引数据”,每天将“小时索引数据”重新处理,建立“天索引数据”,每周将“天索引数据”重新处理,建立“周索引数据”,每月将“周索引数据”重新处理,建立“月索引数据”。在上述每种索引数据中,均包括两种数据:数据文件和索引记录。其中,“月索引数据”作为最终的索引数据。数据文件为实时记录的数据,通常为磁盘上的文件,而索引记录则是放在数据库中。在进行数据查询时,需要从索引记录中读取每个要查询的关键字(比如手机号)在上述各粒度的数据文件中的位置信息,根据该位置信息打开多个数据文件,定位到每个数据文件的开始位置,读取该数据文件,并对读取的数据解压缩后匹配得到与该查询关键字相关的所有记录。
上述这种方案中,对于每一条记录,建立到最终的“月索引数据”都需要进行多次的处理,不仅效率低,而且,每一次处理都需要先将数据从小粒度的数据文件中读出,然后再将其写入大粒度的数据文件中,这无疑会消耗过多的CPU使用时间并增加了磁盘的负荷。另外,在查询时,需要读取多个文件,读取的数据量大,导致解压缩很慢,不能满足快速查询的需求。
发明内容
本发明实施例一方面提供一种实时海量数据索引建立方法及系统,以实现快速、高效地建立索引,满足快速查询的需求。
为此,本发明实施例提供如下技术方案:
一种实时海量数据索引建立方法,包括:
将实时产生的数据记录以追加方式写入到第一内存中;
定时将所述第一内存中存储的数据写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。
一种实时海量数据索引建立系统,包括:
记录单元,用于将实时产生的数据记录以追加方式写入到第一内存中;
文件写入单元,用于定时将所述第一内存中存储的数据写入到历史数据文件中;
索引建立单元,用于在第二内存中建立所述历史数据文件的索引。
本发明实施例实时海量数据索引建立方法及系统,将实时产生的数据记录以追加方式写入到第一内存中;定时将所述第一内存中存储的数据以追加方式写入到历史数据文件中,并在第二内存中建立与写入到历史数据文件中的数据相对应的索引,也就是说,通过对第一内存中的数据进行一次处理(即两次压缩、一次解压缩)即可生成最终的索引数据,完成建立索引的整个过程,因此速度快、效率高;而且,由于减少了对数据文件的读写操作,因此大大降低了对CPU资源的消耗及磁盘的负荷。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1是本发明实施例实时海量数据索引建立方法的流程图;
图2是本发明实施例中第一内存中缓冲区的一种数组结构示意图;
图3是本发明实施例中第二内存的中的索引与历史数据文件的关系;
图4是本发明实施例中进行数据查询的流程图;
图5是本发明实施例实时海量数据索引建立系统的一种结构示意图;
图6是本发明实施例实时海量数据索引建立系统的另一种结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。
本发明实施例实时海量数据索引建立方法及系统,将实时产生的数据记录以追加方式写入到第一内存中;定时将所述第一内存中存储的数据以追加方式写入到历史数据文件中,并在第二内存中建立与写入到历史数据文件中的数据相对应的索引。
如图1所示,是本发明实施例实时海量数据索引建立方法的流程图,包括:
步骤101,将实时产生的数据记录以追加方式写入到第一内存中。
上述数据记录可以是文件形式的记录,每个文件包括至少一条记录,每条记录的长度为不定长。
上述第一内存可以包括:多个缓冲区,比如设为37个缓冲区。
为了方便后续对第一内存中数据的处理,可以将各缓冲区设为数组结构,并且各缓冲区的数组结构相同。
在实际应用中,各缓冲区的数组结构可以根据实际的数据记录的需要来设计,比如,上述缓冲区的一种数组结构可以设计为如图2所示,包括:头部(Head)、Hash字段、和扩展字段(记为Data段)。其中,Hash字段包括多个子块Ri(i=1,2,...),Data段中也包括多个子块Di(i=1,2,...)。Hash字段中的各子块大小相同,Data段中的各子块大小相同,但Hash字段中子块的大小与Data段中子块的大小可以相同,也可以不同。
需要说明的是,上述Data段是对Hash字段的扩展,在Hash字段中的某个子块如H3写满后,可以选择Data段中的一个空闲子块如D2与H3连接,实现对H3的存储空间进行扩展,满足存储实时产生的数据记录的空间需求。当然,上述Data段不是必须的,如果Hash字段的存储空间足够,也可以不用设置上述Data段。
上述头部可以包括以下信息:
a.数据段中使用的Data段个数,记为used_total,初始值为0;
b.释放掉的Data段的个数,记为delete_used,初始值为0;
c.释放掉的Data段的下标,为数组结构,记为delete_index[];
d.该缓冲区在第一内存中的下标,记为mem_index。
当然,上述图2的结构仅是一种示例,在实际应用中,还可以采用其他形式的数组结构,对此本发明实施例不做限定。
在将实时产生的数据记录以追加方式写入到第一内存中时,需要遍历所述数据记录中的每一条记录,对每一条记录进行以下处理:
(1)根据记录中的关键字确定该记录需要写入的缓冲区的序号以及在该缓冲区中Hash字段的子块序号;
(2)将该记录写入确定的缓冲区中Hash字段的子块中,并更新头部信息。
下面以图2所示形式的缓冲区结构为例,进一步详细说明将实时产生的数据记录以追加方式写入到第一内存中的过程。
假设上述数据记录是文件,Hash字段包含的子块个数为H,Data段包含的子块个数为D。
每一个Ri和Di的结构为:
[mem_block_head][M1][M2][...][Mi];
其中,mem_block_head为Ri或Di的头部,包括以下信息:
(1)已经使用的内存大小,记为use_len;
(2)与Ri相连的Di的信息,记为next_di。
每一个Mi的结构为:
[mem_sub_block_head][S1][S2][...][Si];
其中,mem_sub_block_head为Mi的头部,包括以下信息:
(1)是否为压缩,记为mi_z_flag;
(2)所在的Mi块大小或长度,记为mi_len;
(3)关键字(即key)的标志,记为mi_key_flag;
其中,Mi中的Si为压缩或未压缩的数据。
每一个Si由mem_sub_block_record_head加上一条记录组成,mem_sub_block_record_head包括以下信息:
(1)关键字在记录中的开始位置;
(2)关键字在记录中的长度;
(3)记录长度;
(4)年月,即该记录属于哪个月。
对于上述数据记录文件,需要遍历文件中的每一条记录,为了描述方便,将该记录记为(key,value),对每一条记录进行以下处理:
1.计算r_crc32(key),对n(n为第一内存中缓冲区的个数)取余,得到x=r_crc32(key)%n,则将这条记录放到第x块缓冲区中;
2.对于第x块缓冲区,取y=crc32(key)%H,放到Hash字段中的第y个子块中,即放到Ry中;
3.如果Ry已经写满,则将Ry中的数据压缩后继续写;如果Ry已经无法压缩,则在Data段中选择一个空闲的子块Dj,将Ry与Dj相连,然后将记录写到Dj中。
刚开始时,Ry中没有数据,因此,直接增加一个mem_block_head和一个Mi(即M1)即可,并且M1中只有S1,当记录增加到很多时,Ry已经写满的情况下,将M1中的Si全部压缩,并修改mem_sub_block_head中的标志和大小,然后再创建一个M2,将记录存放到M2中,直到Ry再次写满。Ry再次写满后,将M2中的Si全部压缩,然后再创建一个M3。可见,每一条记录放到内存中,只需要压缩一次即可。假如Ry已经写满并且Ry中的数据已无法再压缩,也就是说,Ry中的所有Mi中都已经是压缩后的数据,那么从Data段获取一个空闲的Dj,将Ry与Dj相连,然后将记录写到Dj中。
需要说明的是,将记录写到Dj的方式及过程与将记录写到Ry的方式及过程相同,在此不再赘述。
可以按照以下方式获取一个新的Dj:如果mem_head中的delete_used大于0,则j=delete_index[delete_used-1],同时delete_used减1;否则,j=used_total,并且将used_total本身加1。
当连续获取的空闲Dj超过一定数量(比如10个)时,则将Ry及这些Dj输出到文件系统,清空Ry并释放掉这些Dj
在清空Ry时,可以采用将mem_block_head中的use_len改为0的方式。在释放Dj时,可以采用将j赋给delete_index[delete_used],并且delete_used本身加1的方式。
在上述示例中,根据记录中的关键字确定该记录需要写入的缓冲区的序号以及在该缓冲区中Hash字段的子块序号时分别采用了r_crc32算法和crc32算法。其中,crc32算法是一个数学函数,输入是一个字符串,输出是一个整数,该函数的特点是经过了数学的严格计算,对于少量输入的不同字符串来说,输出的整数都不一样。r_crc32可以称之为反crc32算法,输入是一个字符串,输出是一个正整数,方法是将输入的字符串展开成二进制序列L,将L中的每个比特取反,即0变成1,1变成0,得到新的串~L,然后再由crc32计算得到一个正整数,即r_crc32(L)=crc32(~L)。
需要说明的是,在实际应用中,还可以采用其他算法,比如直接将key对n、H取余,即x=key%n,y=key%H,对此本发明实施例不做限定。
另外,本发明实施例中在Data段选择空闲子块的方式也不仅限于上述示例中描述的算法,还可以采用其他算法,在此不再一一举例。
步骤102,定时将所述第一内存中存储的数据写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。
由于内存为有限资源,当存储的数据达到一定量的时候,需要将这些数据一次性地写入到历史数据文件中,以减少对内存资源的占用。
在本发明实施例中,可以根据实时产生的数据记录的多少来设定上述第一内存的大小,比如可以将其设为存放一天的数据量。
相应地,可以每天将第一内存中存储的数据一次性地写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。另外,为了避免意外故障使第二内存中缓存的索引丢失,还可以定时将所述历史数据文件的索引备份到历史索引文件中。
上述历史数据文件可以是一个包含多个文件的文件夹,比如将该文件夹命名为mem_index。由于每块内存中的数据均可能为不同月份的记录,因此输出时将其按月份输出到相应的月份文件中,比如,输出的文件名的格式为yyyymm.mem_index.flag,其中,yyyymm表示年月,mem_index为0~n-1的数字,flag为“data”或“index”,其中,“data”表示数据文件,“index”表示索引文件。
假设第一内存中包括n个缓冲区,则可以利用多个进程将第一内存中存储的数据写入到历史数据文件中。具体地,可以将每个缓冲区中存储的数据写入到一个或多个对应编号的文件中。例如,将第0个缓冲区中的数据输出到某个月的第0个数据文件中,具体是哪个月,要看第0个缓冲区中的数据而定,该缓冲区中包括了哪些月份的数据就会输出到哪些月份的第0个文件中。比如,第0个缓冲区中的数据分别包含了2011年5月份的数据和2011年4月份的数据,则将2011年5月份的数据追加写到文件201105.data.0中,将2011年4月份的数据追加写到文件201104.data.0中。这样,文件数量大大减少,每个月只有n(比如取n<100)个文件,因此,即使对于一年记录的数据来说,整个系统也只有数百计的文件数,比起现有技术方案中的以千万计的文件数,少了5个数量级(十万分之一),因此大大降低了文件I/O操作,提高系统性能及效率。
对于每一个缓冲区的具体处理过程如下:
遍历该缓冲区中Hash字段中的每个子块Ri,处理每一个Ri及该Ri中next_di指向的所有Di
对每一个Ri的处理方法是:
(1)全部解压缩Ri及该Ri中next_di指向的所有Di,将解压缩后的数据记为T;
(2)将T按预设索引粒度(比如按照月份)分为多份,记为T(j),其中j=1,2,...。
(3)将每份数据T(j)作为一个独立的数据块写入到相应的历史数据文件中,并在第二内存中生成对应每份数据的索引。
具体地,可以首先对每一个T(j)进行压缩,记为Z(j),并生成对应的history_index结构,记为HI(j),并且该HI(j)包括以下信息:
(1)文件的位置,记为file_index;
(2)原数据大小,记为old_size,方便实施时动态分配内存进行处理;
(3)压缩后的大小,记为out_len。
然后,将Z(j)直接写到相应的历史数据文件中,并将HI(j)添加到第二内存中。
需要说明的是,在解压缩Ri和Di时,由于Ri和Di中的每个Mi是单独压缩的,因此,在解压时也需要对Ri和Di中的每个Mi单独解压缩。
另外,在将每份数据作为一个独立的数据块写入到相应的历史数据文件中时,可以先对每份数据进行压缩,然后再将其写入到所述历史数据文件中。
在实际应用中,考虑到数据记录中关键字(key)分布的不均匀性,还可以对上述T(j)做进一步的处理,具体处理如下:
将T(j)包含的数据按预设规则分成F份,比如,取F=5。本发明实施例并不限定F的取值,只是后面将以F=5为例进行描述。每个T(j)对应一个history_index结构,该history_index结构包括以下信息:
(1)文件的位置,记为file_index;
(2)原数据大小,记为old_size[Fi],Fi=0..4,方便实施时动态分配内存进行处理;
(3)压缩后的大小,记为out_len[Fi],Fi=0..4;
(4)填写规则,记为rule;
(5)标志,记为hi_flag[Fi],Fi=0..4。该标志是一个无符号的32位整数,用于存放一个crc32值,或是存放多个标志,由于是32位整数,因此可存放32个标志。
对于每一个T(j),均生成一个history_index结构,该结构如何填写由上述填写规则rule决定,比如,上述填写规则如下表1所示。
表1
Figure BDA0000065322810000081
Figure BDA0000065322810000091
上述填写规则rule可以由T(j)中的数据决定,比如,可以按以下方式来确定:
对T(j)中所有(key,value)计算r_crc32(key),并将此值一样的value部分进行累加,这里只需累加记录数即可,再将r_crc32(key)按记录数从大到小进行排序,得到一个r_crc32(key)的序列,假如为C(i),i=0,1,2,...,将C(i)中记录数占T(j)的总记录数的20%(刚好是1/5,F=5的情况)以上的记为TK,C(i)中TK的个数记为total_TK,那么rule=5-total_TK。
例如,在上面的描述中,C(i)已经进行了排序,如果C(0)超过20%,那么hi_flag[0]=C(0),并且这一小块(即Fi=0)只放r_crc32(key)为C(0)的数据。因此,占用了一个小块,还剩4个小块。假如,还剩下3小块时,已经没有符合的TK,那么剩下的3个小块都要按普通规则进行处理,这时K=3。
上述普通规则是指将数据均匀分放的规则,普通规则的数据填写如下:
取j=(r_crc32(key)/n)%K,这里的K即去掉TK后剩下的块数,对K取余能够达到比较均匀的结果,则Fi=5-rule+j,表示该份在history_index结构中的位置,hi_flag[Fi]的填法如下:
hi_flag[Fi]|=1<<((r_crc32/n/5)%31),n为第一内存中缓冲区个数。
由于每一个关键字并不是每一天都会产生记录,假如一个关键字只在两天中有记录,那么读取文件中的每个数据块显得没有必要,为此,可以使用上述hi_flag[Fi]标志来判断在一个小块中是否有相应的记录,对于那些记录数超过20%的TK来说,判断是否有数据只需直接比较crc32值。
由于hi_flag为32位整数,因此可设置32个标志,这里只使用了31个标志,设置此标志的方法是使用逻辑或,对于两个不同的k1和k2来说,经过一定运算后得到一个0~30的整数Si,这里使用的是Si=(r_crc32/n/5)%31,那么就可以将hi_flag[Fi]的第Si位置置为1。这样,如果发现相关的位置为1,则在该位置对应的数据块中就有可能存在要查找的数据,如果第Si位置为0,则表明在该位置对应的数据块中没有要查找的数据,这时就避免了读取该数据块。
在本发明实施例中,可以通过改变第一内存中缓冲区个数n和Hash字段的个数H,调整历史数据文件中每一个数据块中包含的关键字的个数。例如,假定关键字个数为Total=1亿,取n=80,H=80000,则可得到history_index中的F份数据中的每一份中包含的关键字的个数平均为Total/n/H/F=3.1,而3.1个关键字在31个标志当中重复的概率很低,从而可以使检测一个指定的关键字是否在此标志中的几率大大提高。
此外,本发明实施例中将一个数据块拆成多个小块的方法,除了适用于关键字有少量的记录外,还适用于关键字有巨量记录的情况。假设有两个关键字key1和key2:key1每天生成1千万条记录,key2每天只有几条记录,那么由于key1和key2不相等,因此r_crc32(key1)和r_crc32(key2)也不相等,于是避免了key1的记录和key2的记录放到同一个小块的可能。而在查找key1时只需要对比hi_flag[i](i=0..4)是否等于r_crc32(key1)即可。详细请参考后面的查询步骤404。
将每一个T(j)按上面的方法拆成F份之后,每一份单独进行压缩,连在一起的数据称为F_data,并且生成一个history_index结构,该结构已经记录了每一份的大小和要写到文件中的开始位置,并且,写到文件的方法是追加写,原先的数据保持不变。
每一个history_index结构均写到第二内存中,再由第二内存中备份到历史索引文件中。
上述第二内存的中的索引数据的结构是一个类似于第一内存的哈希结构,与历史数据文件的关系如下图3所示。其中,31表示第二内存中的索引数据,32表示历史数据文件。
由此可见,在本发明实施例中,对于每一条记录,只需要解压缩一次,再压缩一次,即可完成了建立索引的过程,从而大大加快了索引的建立速度。
本发明实施例实时海量数据索引建立方法,将实时产生的数据记录以追加方式写入到第一内存中,通过对第一内存中的数据进行一次处理(即两次压缩、一次解压缩)即可生成最终的索引数据,完成建立索引的整个过程,因此速度快、效率高;而且,由于减少了对数据文件的读写操作,因此大大降低了对CPU资源的消耗及磁盘的负荷。
另外,基于上述这种索引建立方式,还可以提高数据查询效率,满足用户快速查询的需求。
在进行数据查询时,可以根据所有历史索引查找上述历史数据文件,获得与所述关键字相对应的记录。具体地,可以遍历每一个与key相关的history_index结构,直接定位到对应文件yyyymm.mem_index的第file_index个字节,读取out_len个字节,解压缩后从中找出关键字为key的记录。
如图4是所示,是本发明实施例中进行数据查询的流程图,包括以下步骤:
步骤401,根据查询关键字确定需要查询的数据在所述第一内存中所在的缓冲区及所述缓冲区中Hash字段的子块。
对于给定的关键字key和年月yyyymm,则需要查询的数据在所述第一内存中所在的缓冲区的序号为mem_index=r_crc32(key);
需要查询的数据在所述第一内存中所在的缓冲区中Hash字段的子块序号为i=crc32(key)%H。
步骤402,根据所述缓冲区中Hash字段的子块中的信息,确定与该子块相连的扩展字段中的子块。
根据上述计算得到的子块序号i,找到第mem_index个缓冲区中Hash字段中的Ri,根据该Ri中的信息next_di,即可找到扩展字段中与该Ri相连的所有所有Di
步骤403,遍历所述缓冲区中Hash字段的子块及与该子块相连的扩展字段中的子块,得到这些子块中与所述关键字相对应的记录。
遍历上述Ri及与该Ri相连的所有Di,得到这些记录中关键字为key的记录。
步骤404,根据上述需要查询的数据在第一内存中所在的缓冲区的序号,查找第二内存,从所述第二内存中获取与所述关键字相关的所有历史索引。
具体地,如果在将T(j)写入历史数据文件中时,没有对T(j)做进一步的划分,也就是说,是将T(j)作为一个独立的数据块写入到相应的历史数据文件中,则在步骤404中,只需根据上面计算得到的mem_index,查找第二内存,从中读出与key相关的所有历史索引,即history_index结构。
如果在将T(j)写入历史数据文件中时,对T(j)做了划分,则在步骤404中,需要针对每一个history_index结构先判断该关键字是否在此结构中,若在此结构中,进行后面的操作,否则忽略此结构。判断是否在此结构中的方法是:
先计算关键字的crc32值,记为crc32(key),根据rule值进行判断:
Figure BDA0000065322810000121
上表中的普通判定方法是:
取j=(r_crc32(key)/n)%K,Fi=5-rule+j,则直接定位到第Fi小块,若hi_flag[Fi]&((r_crc32(key)/n/5)%31)为真,则认为关键字的数据存在于此小块中。由前面对rule的赋值方法知道,当只有少量关键字的数据放到同一小块中时,若hi_flag[Fi]&((r_crc32(key)/n/5)%31)为真,则该关键字在此小块中存在数据的概率将大大增加。例如,若某一个关键字只存在两三天的数据,那么其它天的history_index结构基本上已经被忽略了,而只需要对这两三天的history_index结构进行处理即可。
假设本发明实施例中,一天只刷新一次第一内存中的数据到文件系统中,因此,对于一个key来说,在第二内存中会有<=31个history_index结构。
步骤405,根据所述所有历史索引查找所述历史数据文件,获得与所述关键字相对应的记录。
具体地,如果在将T(j)写入历史数据文件中时,没有对T(j)做进一步的划分,也就是说,是将T(j)作为一个独立的数据块写入到相应的历史数据文件中,则在步骤405中,只需遍历每一个与key相关的history_index结构,直接定位到对应文件yyyymm.mem_index的第file_index个字节,读取out_len个字节,解压缩后从中找出关键字为key的记录。
如果在将T(j)写入历史数据文件中时,对T(j)做了划分,则在步骤405中,需要遍历每一个与key相关的history_index结构,根据该history_index结构中的信息,确定是否有与key相关的记录,如果有,则根据yyyymm定位相应的文件,从该文件中获得与关键字key相关的数据。获取的方法是先按照前面的判定方法定位到结构history_index的第Fi小块,得到压缩后的大小out_len[Fi],然后打开其中的yyyymm.mem_index对应的文件(只有一个),定位到file_index+out_len[0]+...out_len[Fi-1],直接读取out_len[Fi]字节,并解压缩,再从中找出关键字为key的记录。
由此可见,对于每一个要查询的关键字,只要根据该关键字,定位第一内存中的子块以及第二内存中的索引,从这些子块查找到与该关键字相对应的数据,从第二内存的索引中读取出数据文件中的偏移量,然后打开数据文件,根据该偏移量从打开的数据文件中读取与该关键字相对应的记录。
假定在实际应用中,输入记录数为20亿,大小为500Gbit,所使用内存(即第一内存)为96Gbit,因此根据前面的H=80000及D=24000,计算得出每一个Ri或Di的大小为26K,而解压26K的数据在1毫秒左右,因此,从第一内存缓冲中可以快速查询到相应的数据。另外,在历史数据文件中,一般地说,只需要读取31个或更少的数据块,每块在4Kbit~8Kbit左右,即可得到与输入关键字相关的数据。对存在大量记录的关键字来说,也只是读取31个左右的数据块,速度非常快。
假设每个月有31个history_index结构,每一个history_index结构的大小记为sizeof(history_index),因此每个月的索引内存(即第二内存)大小为:n*H*31*sizeof(history_index)=37*80000*31*sizeof(history_index)。假设sizeof(history_index)=52,则每月的索引内存仅占37*80000*31*52=4.5G bit,因此,若存放半年的索引,只需要28G bit的内存,加上前面的第一内存96Gbit,所需内存总量小于128G bit。因此,利用本明实施例的方法,只需要一台小型机即可完成海量数据的快速索引建立及查询。
相应地,本发明实施例还提供一种实时海量数据索引建立系统,如图5所示,是该系统的一种结构示意图。
在该实施例中,所述系统包括:
记录单元501,用于将实时产生的数据记录以追加方式写入到第一内存中;
文件写入单元502,用于定时将所述第一内存中存储的数据写入到历史数据文件中;
索引建立单元503,用于在第二内存中建立所述历史数据文件的索引。
在本发明实施例中,上述第一内存可以包括:多个缓冲区,而且,为了方便后续对第一内存中数据的处理,可以将各缓冲区设为数组结构,并且各缓冲区的数组结构相同。
在实际应用中,各缓冲区的数组结构可以根据实际的数据记录的需要来设计,如前面所述,上述缓冲区的一种数组结构可以包括:头部和Hash字段,进一步还可以包括:扩展字段。其中,Hash字段包括大小相同的多个子块,扩展字段中也包括大小相同的多个子块,Hash字段中子块的大小与Data段中子块的大小可以相同,也可以不同。
相应地,上述记录单元501可以包括:第一遍历子单元、子块确定子单元和子块写入子单元,其中:
上述第一遍历子单元用于遍历所述数据记录中的每一条记录;
上述子块确定子单元用于对所述第一遍历子单元遍历到的每一条记录,根据所述记录中的关键字确定所述记录需要写入的缓冲区的序号以及在该缓冲区中Hash字段的子块序号;
上述子块写入子单元用于将所述记录写入确定的缓冲区中Hash字段的子块中,并更新头部信息。
进一步,上述记录单元501还可包括:压缩子单元和选择子单元,其中:
上述压缩子单元用于在所述Hash字段中的子块已写满时,将所述子块中的数据压缩;然后通知所述子块写入子单元将所述记录写入所述子块;
上述选择子单元用于在所述Hash字段中的子块中的数据已经无法压缩时,在所述扩展字段中选择一个空闲子块,并将所述Hash字段中的子块与所述扩展字段中的空闲子块相连;
相应地,上述子块写入子单元还用于将所述记录写入所述选择子单元选择的空闲子块中。
在本发明实施例中,所述系统还可进一步包括:
刷新单元504,用于在与所述Hash字段中的子块相连的扩展字段中子块的数量超过设定值时,将所述Hash字段中的子块及与其相连的扩展字段中的子块输出到所述历史数据文件中,并在第二内存中建立所述历史数据文件的索引,然后清空所述Hash字段中的子块并释放掉与其相连的扩展字段中的子块。
在本发明实施例中,上述文件写入单元502包括:第二遍历子单元、解压缩子单元、划分子单元和文件写入子单元。其中:
上述第二遍历子单元用于对所述第一内存中的每一个缓冲区,遍历所述缓冲区中Hash字段中的每个子块;
上述解压缩子单元用于解压缩所述第二遍历子单元遍历到的Hash字段中的子块及与该子块相连的扩展字段中的子块;
上述划分子单元用于将解压缩后的数据按预设索引粒度划分为多份;
上述文件写入子单元用于将所述划分子单元划分出的每份数据作为一个独立的文件写入到所述历史数据文件中。
相应地,上述索引建立单元503具体用于在所述第二内存中生成对应每份数据的索引。
在本发明实施例中,可以根据实时产生的数据记录的多少来设定上述第一内存的大小,比如可以将其设为存放一天的数据量。
相应地,上述文件写入单元502可以每天将第一内存中存储的数据一次性地写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。
另外,为了避免意外故障使第二内存中缓存的索引丢失,本发明实施例的系统还可进一步包括:备份单元(未图示),用于定时将所述历史数据文件的索引备份到历史索引文件中。
本发明实施例实时海量数据索引建立系统,将实时产生的数据记录以追加方式写入到第一内存中,通过对第一内存中的数据进行一次处理(即两次压缩、一次解压缩)即可生成最终的索引数据,完成建立索引的整个过程,因此速度快、效率高;而且,由于减少了对数据文件的读写操作,因此大大降低了对CPU资源的消耗及磁盘的负荷。
如图6所示,是本发明实施例实时海量数据索引建立系统的另一种结构示意图。
与图6所示实施例不同的是,该实施例实时海量数据索引建立系统进一步包括:
关键字输入单元601,用于输入查询关键字;
缓冲区确定单元602,用于根据查询关键字确定需要查询的数据在所述第一内存中所在的缓冲区及所述缓冲区中Hash字段的子块;
第一查询单元603,用于根据所述缓冲区中Hash字段的子块中的信息,确定与该子块相连的扩展字段中的子块;遍历所述缓冲区中Hash字段的子块及与该子块相连的扩展字段中的子块,得到这些子块中与所述关键字相对应的记录;
第二查询单元604,用于根据所述缓冲区确定单元确定的缓冲区的序号,查找第二内存,从所述第二内存中获取与所述关键字相关的所有历史索引;根据所述所有历史索引查找所述历史数据文件,获得与所述关键字相对应的记录。
该实施例的系统,基于图5所示实施例基础上,不仅可以针对实时的海量数据快速建立索引,而且还可以提供快速查询的功能,满足用户快速查询的需求。
本发明实施例实时海量数据索引建立方法及系统,由于降低了建立索引对CPU的占用时间,因此本发明实施例的方案可运行在单一的小型机上,大大节约硬件成本及维护成本。在硬件方面,只需要一台内存128Gbit的小型机,外加20Tbit存储容量,即可实时处理总关键字达1亿个、每天20亿条记录,6个月共3000亿条记录,90Tbit的数据量。
本发明方案可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序单元。一般地,程序单元包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明方案,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序单元可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上对本发明实施例进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及设备;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (15)

1.一种实时海量数据索引建立方法,其特征在于,包括:
将实时产生的数据记录以追加方式写入到第一内存中;
定时将所述第一内存中存储的数据写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引。
2.根据权利要求1所述的方法,其特征在于,所述数据记录为文件形式,所述文件包括至少一条记录,每条记录的长度为不定长。
3.根据权利要求1所述的方法,其特征在于,所述第一内存包括:多个缓冲区,所述缓冲区为数组结构,并且各缓冲区的数组结构相同;所述缓冲区包括:头部和Hash字段,所述Hash字段包括大小相同的多个子块;
所述将实时产生的数据记录以追加方式写入到第一内存中包括:
遍历所述数据记录中的每一条记录,对每一条记录进行以下处理:
根据所述记录中的关键字确定所述记录需要写入的缓冲区的序号以及在该缓冲区中Hash字段的子块序号;
将所述记录写入确定的缓冲区中Hash字段的子块中,并更新头部信息。
4.根据权利要求3所述的方法,其特征在于,所述缓冲区还包括:扩展字段,所述扩展字段包括多个大小相同的子块;
所述方法还包括:
在将所述记录写入Hash字段中的子块时,如果所述子块已写满,则先将所述子块中的数据压缩,然后再将所述记录写入所述子块;
如果所述子块中的数据已经无法压缩,则在所述扩展字段中选择一个空闲子块,并将所述Hash字段中的子块与所述扩展字段中的空闲子块相连,然后将所述记录写入选择的空闲子块中。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
如果与所述Hash字段中的子块相连的扩展字段中子块的数量超过设定值,则将所述Hash字段中的子块及与其相连的扩展字段中的子块输出到所述历史数据文件中,并在第二内存中建立所述历史数据文件的索引;然后,清空所述Hash字段中的子块并释放掉与其相连的扩展字段中的子块。
6.根据权利要求4或5所述的方法,其特征在于,所述定时将所述第一内存中存储的数据写入到历史数据文件中,并在第二内存中建立所述历史数据文件的索引包括:
对所述第一内存中的每一个缓冲区进行如下处理:
遍历所述缓冲区中Hash字段中的每个子块;
解压缩所述Hash字段中的子块及与该子块相连的扩展字段中的子块;
将解压缩后的数据按预设索引粒度划分为多份,每份数据作为一个独立的文件写入到所述历史数据文件中,并在所述第二内存中生成对应每份数据的索引。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
定时将所述历史数据文件的索引备份到历史索引文件中。
8.根据权利要求4所述的方法,其特征在于,还包括:
当需要查询时,根据查询关键字确定需要查询的数据在所述第一内存中所在的缓冲区及所述缓冲区中Hash字段的子块;
根据所述缓冲区中Hash字段的子块中的信息,确定与该子块相连的扩展字段中的子块;
遍历所述缓冲区中Hash字段的子块及与该子块相连的扩展字段中的子块,得到这些子块中与所述关键字相对应的记录;
根据所述需要查询的数据在所述第一内存中所在的缓冲区的序号,查找第二内存,从所述第二内存中获取与所述关键字相关的所有历史索引;
根据所述所有历史索引查找所述历史数据文件,获得与所述关键字相对应的记录。
9.一种实时海量数据索引建立系统,其特征在于,包括:
记录单元,用于将实时产生的数据记录以追加方式写入到第一内存中;
文件写入单元,用于定时将所述第一内存中存储的数据写入到历史数据文件中;
索引建立单元,用于在第二内存中建立所述历史数据文件的索引。
10.根据权利要求9所述的系统,其特征在于,所述第一内存包括:多个缓冲区,所述缓冲区为数组结构,并且各缓冲区的数组结构相同;所述缓冲区包括:头部和Hash字段,所述Hash字段包括大小相同的多个子块;
所述记录单元包括:
第一遍历子单元,用于遍历所述数据记录中的每一条记录;
子块确定子单元,用于对所述第一遍历子单元遍历到的每一条记录,根据所述记录中的关键字确定所述记录需要写入的缓冲区的序号以及在该缓冲区中Hash字段的子块序号;
子块写入子单元,用于将所述记录写入确定的缓冲区中Hash字段的子块中,并更新头部信息。
11.根据权利要求10所述的系统,其特征在于,所述缓冲区还包括:扩展字段,所述扩展字段包括多个大小相同的子块;
所述记录单元还包括:
压缩子单元,用于在所述Hash字段中的子块已写满时,将所述子块中的数据压缩;然后通知所述子块写入子单元将所述记录写入所述子块;
选择子单元,用于在所述Hash字段中的子块中的数据已经无法压缩时,在所述扩展字段中选择一个空闲子块,并将所述Hash字段中的子块与所述扩展字段中的空闲子块相连;
所述子块写入子单元,还用于将所述记录写入所述选择子单元选择的空闲子块中。
12.根据权利要求11所述的系统,其特征在于,所述系统还包括:
刷新单元,用于在与所述Hash字段中的子块相连的扩展字段中子块的数量超过设定值时,将所述Hash字段中的子块及与其相连的扩展字段中的子块输出到所述历史数据文件中,并在第二内存中建立所述历史数据文件的索引,然后,清空所述Hash字段中的子块并释放掉与其相连的扩展字段中的子块。
13.根据权利要求11或12所述的系统,其特征在于,
所述文件写入单元包括:
第二遍历子单元,用于对所述第一内存中的每一个缓冲区,遍历所述缓冲区中Hash字段中的每个子块;
解压缩子单元,用于解压缩所述第二遍历子单元遍历到的Hash字段中的子块及与该子块相连的扩展字段中的子块;
划分子单元,用于将解压缩后的数据按预设索引粒度划分为多份;
文件写入子单元,用于将所述划分子单元划分出的每份数据作为一个独立的文件写入到所述历史数据文件中;
所述索引建立单元,具体用于在所述第二内存中生成对应每份数据的索引。
14.根据权利要求9所述的系统,其特征在于,所述系统还包括:
备份单元,用于定时将所述历史数据文件的索引备份到历史索引文件中。
15.根据权利要求11所述的系统,其特征在于,所述系统还包括:
关键字输入单元,用于输入查询关键字;
缓冲区确定单元,用于根据查询关键字确定需要查询的数据在所述第一内存中所在的缓冲区及所述缓冲区中Hash字段的子块;
第一查询单元,用于根据所述缓冲区中Hash字段的子块中的信息,确定与该子块相连的扩展字段中的子块;遍历所述缓冲区中Hash字段的子块及与该子块相连的扩展字段中的子块,得到这些子块中与所述关键字相对应的记录;
第二查询单元,用于根据所述缓冲区确定单元确定的缓冲区的序号,查找第二内存,从所述第二内存中获取与所述关键字相关的所有历史索引;根据所述所有历史索引查找所述历史数据文件,获得与所述关键字相对应的记录。
CN 201110144807 2011-05-31 2011-05-31 实时海量数据索引建立方法及系统 Expired - Fee Related CN102207964B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201110144807 CN102207964B (zh) 2011-05-31 2011-05-31 实时海量数据索引建立方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201110144807 CN102207964B (zh) 2011-05-31 2011-05-31 实时海量数据索引建立方法及系统

Publications (2)

Publication Number Publication Date
CN102207964A true CN102207964A (zh) 2011-10-05
CN102207964B CN102207964B (zh) 2013-06-05

Family

ID=44696798

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201110144807 Expired - Fee Related CN102207964B (zh) 2011-05-31 2011-05-31 实时海量数据索引建立方法及系统

Country Status (1)

Country Link
CN (1) CN102207964B (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102646130A (zh) * 2012-03-12 2012-08-22 华中科技大学 一种海量历史数据的存储及索引方法
CN103186617A (zh) * 2011-12-30 2013-07-03 北京新媒传信科技有限公司 一种存储数据的方法和装置
CN104182522A (zh) * 2014-08-26 2014-12-03 中国科学院信息工程研究所 一种基于循环位图模型的辅助索引方法及装置
CN105808622A (zh) * 2014-12-31 2016-07-27 乐视网信息技术(北京)股份有限公司 一种文件存储的方法和装置
CN111597403A (zh) * 2020-05-21 2020-08-28 北京字节跳动网络技术有限公司 一种构建图索引的方法、装置、电子设备及存储介质
CN111831622A (zh) * 2020-03-31 2020-10-27 北京嘀嘀无限科技发展有限公司 数据索引生成方法、装置、电子设备和可读存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101110074A (zh) * 2007-01-30 2008-01-23 浪潮乐金信息系统有限公司 基于文件系统缓存的数据加速查询方法
CN101251861A (zh) * 2008-03-18 2008-08-27 北京锐安科技有限公司 一种海量数据加载和查询的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101110074A (zh) * 2007-01-30 2008-01-23 浪潮乐金信息系统有限公司 基于文件系统缓存的数据加速查询方法
CN101251861A (zh) * 2008-03-18 2008-08-27 北京锐安科技有限公司 一种海量数据加载和查询的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
万达等: "面向实时应用的时态数据库系统体系结构", 《计算机应用研究》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103186617A (zh) * 2011-12-30 2013-07-03 北京新媒传信科技有限公司 一种存储数据的方法和装置
CN103186617B (zh) * 2011-12-30 2016-04-06 北京新媒传信科技有限公司 一种存储数据的方法和装置
CN102646130A (zh) * 2012-03-12 2012-08-22 华中科技大学 一种海量历史数据的存储及索引方法
CN104182522A (zh) * 2014-08-26 2014-12-03 中国科学院信息工程研究所 一种基于循环位图模型的辅助索引方法及装置
CN104182522B (zh) * 2014-08-26 2017-04-19 中国科学院信息工程研究所 一种基于循环位图模型的辅助索引方法及装置
CN105808622A (zh) * 2014-12-31 2016-07-27 乐视网信息技术(北京)股份有限公司 一种文件存储的方法和装置
CN111831622A (zh) * 2020-03-31 2020-10-27 北京嘀嘀无限科技发展有限公司 数据索引生成方法、装置、电子设备和可读存储介质
CN111597403A (zh) * 2020-05-21 2020-08-28 北京字节跳动网络技术有限公司 一种构建图索引的方法、装置、电子设备及存储介质

Also Published As

Publication number Publication date
CN102207964B (zh) 2013-06-05

Similar Documents

Publication Publication Date Title
JP6778795B2 (ja) データを記憶するための方法、装置及びシステム
EP3238106B1 (en) Compaction policy
CN102207964B (zh) 实时海量数据索引建立方法及系统
CN102112986B (zh) 对基于列的数据编码的结构的高效的大规模处理
CN107133342A (zh) 一种IndexR实时数据分析库
US20130138730A1 (en) Automated client/server operation partitioning
CN102375853A (zh) 分布式数据库系统、在其中建立索引的方法和查询方法
CN102831222A (zh) 一种基于重复数据删除的差量压缩方法
CN101751406A (zh) 一种实现基于列存储的关系型数据库的方法及装置
CN103488684A (zh) 基于缓存数据多线程处理的电力可靠性指标快速计算方法
CN103914483B (zh) 文件存储方法、装置及文件读取方法、装置
CN102073697A (zh) 一种数据处理方法及装置
CN110096509A (zh) 大数据环境下实现历史数据拉链表存储建模处理的系统及方法
US20240330265A1 (en) Logical partitioning of memory within a computing device
CN115438114B (zh) 存储格式转换方法、系统、装置、电子设备及存储介质
US11880368B2 (en) Compressing data sets for storage in a database system
CN114329096A (zh) 一种原生图数据库处理方法及系统
Abu-Libdeh et al. Learned indexes for a google-scale disk-based database
CN102207935A (zh) 用于创建索引的方法和系统
CN109471864A (zh) 一种面向并行文件系统双层索引方法和系统
CN110377227B (zh) 一种数据分块存储方法、装置及电子设备
CN111723089B (zh) 一种基于列式存储格式处理数据的方法和装置
JP7120439B2 (ja) データ一般化装置、データ一般化方法、プログラム
CN104750815A (zh) 一种基于HBase的Lob数据的存储方法及装置
CN108182209A (zh) 一种数据索引方法、及设备

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C56 Change in the name or address of the patentee

Owner name: CONGXING TECHNOLOGY CO., LTD.

Free format text: FORMER NAME: SNRISE CORPORATION

CP03 Change of name, title or address

Address after: 510070 one of the 83 best and 507 self compiled works in martyrs Middle Road, Yuexiu District, Guangdong, Guangzhou four, 508

Patentee after: Sunrise Technology Co., Ltd.

Address before: 19, building 368, 510300 South Guangzhou Avenue, Guangdong, Guangzhou

Patentee before: Snrise Corporation

ASS Succession or assignment of patent right

Owner name: HONGKONG SHIYE DEVELOPMENT CO., LTD.

Free format text: FORMER OWNER: CONGXING TECHNOLOGY CO., LTD.

Effective date: 20150731

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150731

Address after: Room 32, building 3205, Bank of America, 12 Cecil Harcourt Road, central, Hongkong, China

Patentee after: Hongkong world industry development Co., Ltd.

Address before: 510070 one of the 507 writers in 83 Middle Road, martyrs' road, Guangzhou, Guangdong, four, 508, edited by myself, Yuexiu District

Patentee before: Sunrise Technology Co., Ltd.

ASS Succession or assignment of patent right

Owner name: TELEFON AB L.M. ERICSSON (SE)

Free format text: FORMER OWNER: HONGKONG SHIYE DEVELOPMENT CO., LTD.

Effective date: 20150909

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150909

Address after: Stockholm

Patentee after: Telefon AB L.M. Ericsson [SE]

Address before: Room 32, building 3205, Bank of America, 12 Cecil Harcourt Road, central, Hongkong, China

Patentee before: Hongkong world industry development Co., Ltd.

CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130605

Termination date: 20170531

CF01 Termination of patent right due to non-payment of annual fee