一种读取海量数据的方法及装置转让专利

申请号 : CN201110453151.9

文献号 : CN102567528B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 马帅邢铁军张霞房轶臣

申请人 : 东软集团股份有限公司

摘要 :

本发明实施例公开了一种读取海量数据的方法及装置,所述方法包括:i)获取待读取的海量数据;ii)获取指定字段的名称并将所有记录按指定字段进行排序;iii)获取起始位置及要预读取的记录的数量;iv)从起始位置预读取所述数量的记录作为当前数据段;v)在当前数据段中,按从后向前的顺序对各条记录的指定字段的值进行遍历,以获取结尾位置,即指定字段的值发生改变的记录的位置;vi)将起始位置与结尾位置之间的记录作为一段数据进行正式读取,并将结尾位置处的记录的下一条记录的位置作为新的起始位置,进入步骤iii)。本发明在分段读取海量数据时可动态调整每段数据的起始位置和结尾位置,从而保证了每段数据的完整性。

权利要求 :

1.一种读取海量数据的方法,其特征在于,包括以下步骤:i)获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;

ii)获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段的值进行排序,以使所述指定字段值相同的记录相邻;

iii)获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;

iv)从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;

v)在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;

vi)将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置,进入步骤iii)。

2.根据权利要求1所述的方法,其特征在于,步骤v)具体包括:a、将所述当前数据段的最后一条记录作为当前记录;

b、判断当前记录及其上一条记录的所述指定字段的值是否相同,若相同,则将所述当前记录的上一条记录作为新的当前记录,重复步骤b;若不同,则获取所述当前记录的上一条记录的位置作为结尾位置。

3.根据权利要求1所述的方法,其特征在于,步骤iv)之后还包括以下步骤:判断所述当前数据段之后是否还有后续数据,若有则继续执行,若没有,则将当前数据段作为一段数据进行正式读取并退出。

4.根据权利要求3所述的方法,其特征在于,判断所述当前数据段之后是否还有后续数据的步骤,具体包括:A、读取所述当前数据段之后的若干条记录作为冗余记录;

B、判断所述冗余记录的第一条记录是否为空,若是,则判断没有后续记录,若否,则判断有后续记录。

5.根据权利要求4所述的方法,其特征在于,步骤A中所述若干条具体为一条。

6.一种读取海量数据的装置,其特征在于,包括:数据准备单元,用于获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;

预处理单元,用于获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段的值进行排序,以使所述指定字段值相同的记录相邻;

起点获取单元,用于获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;

预读单元,用于从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;

结尾获取单元,用于在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;

正式读取单元,用于将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置。

7.根据权利要求6所述的装置,其特征在于,所述结尾获取单元具体包括:初始化子单元:用于将所述当前数据段的最后一条记录作为当前记录;

循环判断子单元:用于判断当前记录及其上一条记录的所述指定字段的值是否相同;

若相同,则将所述当前记录的上一条记录作为新的当前记录,继续判断当前记录及其上一条记录的所述指定字段的值是否相同;若不同,则获取所述当前记录的上一条记录的位置作为结尾位置。

8.根据权利要求6所述的装置,其特征在于,还包括:后续数据判断单元,用于判断所述当前数据段之后是否还有后续数据,若没有则调用结束单元;

所述结束单元,用于将当前数据段作为一段数据进行正式读取并退出。

9.根据权利要求8所述的装置,其特征在于,所述后续数据判断单元具体包括:后续数据读取子单元,用于读取所述当前数据段之后的若干条记录作为冗余记录;

后续数据判断子单元,用于判断所述冗余记录的第一条记录是否为空,若是,则调用结束单元。

10.根据权利要求9所述的装置,其特征在于所述若干条具体为一条。

说明书 :

一种读取海量数据的方法及装置

技术领域

[0001] 本发明涉及数据处理领域,尤其是涉及一种读取海量数据的方法及装置。

背景技术

[0002] 在生产生活中,经常需要制作各种报表。在生成、显示报表时,不可避免的会遇到海量数据的读取以及显示问题,换句话说,报表中所涉及的数据少则几万条,多则几十万甚至上百万条,如何将这么多的数据正确地读取到内存进而显示在界面上,是每个报表产品所面临的挑战。
[0003] 报表所涉及的海量数据一般都是存储在数据库里。在现有技术中,生成报表时通常是对数据库数据进行分段(或称分批)读取,每次读取数据库中固定数量的数据,比如数据库中待读取的数据是10万条,每次读取5000条并显示,则一共读取20次可将所有数据读取完毕。使用这种分段读取的方式可以避免一次性读取全部数据而导致的内存溢出的问题。
[0004] 发明人在实现本发明的过程中,发现现有技术至少存在如下缺点:当某些数据存在关联时,这种按固定数量分段读取的方式可能会将这些有关联的数据分割开来,使得数据的完整性被破坏,从而导致在统计、汇总等处理时出现错误。例如,数据库中存储有多条城市记录,同时对各条记录按照所属地区进行了分组,如表1所示:
[0005] 表1
[0006]地区 城市 分公司 营业额
华北 北京 BJ 3
东北 大连 DL 2
东北 沈阳 SY 1
[0007] 在读取第一段数据时,可能只读取了前两条记录,则进行小计时得到如表2所示的结果:
[0008] 表2
[0009]
[0010] 在读取第二段数据时,才读取到第三条记录,则进行小计时得到如表3所示的结果:
[0011] 表3
[0012]
[0013] 可见现有技术中,在读取多条记录时将属于东北分组的数据强制分开,这样不但对东北地区的城市进行了两次小计,而且因为每次只统计了一部分数据,故小计的结果也都是不正确的。
[0014] 又例如,数据库中存储有多条薪金记录,如表4所示:
[0015] 表4
[0016]姓名 种类 金额 月份
张三 工资 2000 11月
张三 奖金 800 11月
张三 餐补 200 11月
张三 交通补 150 11月
李四 工资 3000 11月
李四 奖金 500 11月
李四 餐补 250 11月
[0017]李四 交通补 100 11月
[0018] 在读取第一段数据时,可能只读取到前六条记录,则按姓名可得到如下交叉汇总表(该表中的一条记录对应原始表中的多条记录),即表5:
[0019] 表5
[0020]
[0021] 在读取第二段数据时,才读到后两条记录,得到如下交叉汇总表,即表6:
[0022] 表6
[0023]
[0024] 可见,“李四”的工资被合计了两次,这样的结果显然是错误的,用户无法接受。

发明内容

[0025] 本发明实施例要解决的技术问题是:在分段读取海量数据时,数据的完整性被破坏的问题。
[0026] 本发明实施例提供了一种读取海量数据的方法,包括以下步骤:
[0027] i)获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;
[0028] ii)获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段的值进行排序,以使所述指定字段值相同的记录相邻;
[0029] iii)获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;
[0030] iv)从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;
[0031] v)在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;
[0032] vi)将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置,进入步骤iii)。
[0033] 优选的,步骤v)具体包括:
[0034] a、将所述当前数据段的最后一条记录作为当前记录;
[0035] b、判断当前记录及其上一条记录的所述指定字段的值是否相同,若相同,则将所述当前记录的上一条记录作为新的当前记录,重复步骤b;若不同,则获取所述当前记录的上一条记录的位置作为结尾位置。
[0036] 优选的,步骤iv)之后还包括以下步骤:
[0037] 判断所述当前数据段之后是否还有后续数据,若有则继续执行,若没有,则将当前数据段作为一段数据进行正式读取并退出。
[0038] 优选的,判断所述当前数据段之后是否还有后续数据的步骤,具体包括:
[0039] A、读取所述当前数据段之后的若干条记录作为冗余记录;
[0040] B、判断所述冗余记录的第一条记录是否为空,若是,则判断没有后续记录,若否,则判断有后续记录。
[0041] 优选的,步骤A中所述若干条具体为一条。
[0042] 本发明实施例还提供了一种读取海量数据的装置,包括:
[0043] 数据准备单元,用于获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;
[0044] 预处理单元,用于获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段的值进行排序,以使所述指定字段值相同的记录相邻;
[0045] 起点获取单元,用于获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;
[0046] 预读单元,用于从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;
[0047] 结尾获取单元,用于在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;
[0048] 正式读取单元,用于将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置。
[0049] 优选的,所述结尾获取单元具体包括:
[0050] 初始化子单元:用于将所述当前数据段的最后一条记录作为当前记录;
[0051] 循环判断子单元:用于判断当前记录及其上一条记录的所述指定字段的值是否相同;若相同,则将所述当前记录的上一条记录作为新的当前记录,继续判断当前记录及其上一条记录的所述指定字段的值是否相同;若不同,则获取所述当前记录的上一条记录的位置作为结尾位置。
[0052] 优选的所述的装置还可以包括:
[0053] 后续数据判断单元,用于判断所述当前数据段之后是否还有后续数据,若没有则调用结束单元;
[0054] 所述结束单元,用于将当前数据段作为一段数据进行正式读取并退出。
[0055] 优选的,所述后续数据判断单元具体包括:
[0056] 后续数据读取子单元,用于读取所述当前数据段之后的若干条记录作为冗余记录;
[0057] 后续数据判断子单元,用于判断所述冗余记录的第一条记录是否为空,若是,则调用结束单元。
[0058] 优选的所述若干条具体为一条。
[0059] 本发明实施例的方法和装置,在分段读取海量数据时,通过使用完整性字段技术动态调整了每段数据的起始位置和结尾位置,从而保证了每段数据的完整性,使得统计、汇总等处理可以得到正确的结果。此外,通过读取冗余记录解决了无法预知后续是否还有数据的问题。

附图说明

[0060] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0061] 图1是本发明实施例一方法的流程图;
[0062] 图2是本发明实施例二方法的流程图;
[0063] 图3是本发明实施例三装置的示意图。

具体实施方式

[0064] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0065] 实施例一
[0066] 图1为本发明实施例一方法的流程图,包括以下步骤:
[0067] S101:获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;
[0068] S102:获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段进行排序,以使所述指定字段值相同的记录相邻;
[0069] S103:获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;
[0070] S104:从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;
[0071] S105:在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;
[0072] S106:将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置,进入S103。
[0073] 实施例二
[0074] 图2是本发明实施例二方法的流程图,包括以下步骤:
[0075] S201:获取海量数据。获取海量数据具体可以是获取海量数据的位置,例如在磁盘上的地址等。本实施例中海量数据为数据库里存储的海量的薪资记录数据,每条薪资记录包括“姓名”、“工资”、“奖金”等字段。
[0076] S202:选择“姓名”字段作为完整性字段。完整性字段即指定字段。
[0077] S203:按“姓名”进行排序。使所有姓名为“张三”的记录紧邻组成形式上的一组、所有姓名为“李四”的记录记录紧邻组成形式上的一组,等等。经过排序之后,相当于按姓名进行了分组,确保了只要不将该组分割则该姓名的各条记录就不会被分割。
[0078] S204:设x=1,m=500。本步骤的作用是将x和m进行初始化。在本实施例中m为每次预读取的记录的数量,即每次预读取数据段的长度,为固定值。x为每次预读时预读的第一条记录的位置,也即每次预读取数据段的起始位置,同时也作为正式读取的数据段的起始位置。
[0079] S205:将x至y之间的m条记录作为预读取数据段预读入内存,并作为当前数据段,其中y=x+m-1。需要注意的是,在有的情况下,从x开始读取m条记录时,可能x后面的数据还不够m条,此时m变为实际读取的记录的条数。
[0080] S206:判断y之后是否还有后续数据,若没有则进入S207,若有则进入S208。本步骤为可选步骤。在本发明其他实施例中可以不对y之后是否还有后续数据进行判断,在这种情况下当预读取到空数据段时自动退出流程即可。
[0081] S207:将x至y之间的记录作为一段数据进行正式读取并退出流程。
[0082] S208:获取第y条记录的“姓名”字段的值a,例如a=李四。
[0083] S209:i=1,其中i为一临时计数变量。本步骤的作用是将i进行初始化。
[0084] S210:获取第y-i条记录的“姓名”字段的值b,例如b=张三。
[0085] S211:判断b是否等于a。若是,则进入S212。若否,则代表“姓名”字段的值在此处发生了改变,y-i即需要正式读取的数据段的结尾位置,进入S213。注意,本实施例中是将y与y-i的“姓名”字段进行比较,在本发明其他实施例中,还可以令i初始时为0,通过每次将y-i与y-i-1进行比较来查找发了改变的位置。
[0086] S212:i=i+1,继续执行S210。
[0087] S213:将x至y-i之间的记录进行正式读取。正式读取之后,还可以有将这x至y-i之间的记录输出到屏幕上进行显示,或是输出至其他存储器中等步骤。
[0088] S214:x=y-i+1。即将y-i下一条记录的位置作为下一预读取数据段的起始位置,然后循环执行S205。
[0089] 另外,优选的步骤S206可以具体包括以下步骤:
[0090] S2061:读取所述当前数据段之后的n条记录作为冗余记录,即读取y+1~y+n条记录作为冗余记录,其中n≥1。本实施例中优选n=1。
[0091] S2062:判断所述冗余记录的第一条记录即y+1条记录是否为空,若是,则判断没有后续记录,若否,则判断有后续记录。
[0092] 实施例三
[0093] 图3是本发明实施例三装置的示意图,包括:
[0094] 数据准备单元301,用于获取待读取的海量数据,所述海量数据包含多条记录,每条所述记录包含若干字段;
[0095] 预处理单元302,用于获取所述海量数据中指定字段的名称,并将所述海量数据中的所有记录按所述指定字段进行排序,以使所述指定字段值相同的记录相邻;
[0096] 起点获取单元303,用于获取从所述海量数据中读取数据时的起始位置及要预读取的记录的数量;
[0097] 预读单元304,用于从所述海量数据中的所述起始位置预读取所述数量的记录作为当前数据段;
[0098] 结尾获取单元305,用于在所述当前数据段中,按从后向前的顺序对各条记录的所述指定字段的值进行遍历,以获取结尾位置,所述结尾位置为所述指定字段的值发生改变的记录的位置;
[0099] 正式读取单元306,用于将所述起始位置与所述结尾位置之间的记录作为一段数据进行正式读取,并将所述结尾位置处的记录的下一条记录的位置作为新的起始位置。
[0100] 优选的,所述结尾获取单元305具体包括:
[0101] 初始化子单元:用于将所述当前数据段的最后一条记录作为当前记录;
[0102] 循环判断子单元:用于判断当前记录及其上一条记录的所述指定字段的值是否相同;若相同,则将所述当前记录的上一条记录作为新的当前记录,继续判断当前记录及其上一条记录的所述指定字段的值是否相同;若不同,则获取所述当前记录的上一条记录的位置作为结尾位置。
[0103] 优选的所述装置还可以包括:
[0104] 后续数据判断单元,用于判断所述当前数据段之后是否还有后续数据,若没有则调用结束单元;
[0105] 结束单元,用于将当前数据段作为一段数据进行正式读取并退出。
[0106] 优选的,所述后续数据判断单元具体可以包括:
[0107] 后续数据读取子单元,用于读取所述当前数据段之后的若干条记录作为冗余记录;
[0108] 后续数据判断子单元,用于判断所述冗余记录的第一条记录是否为空,若否,则调用结束单元。
[0109] 优选的所述若干条具体为一条。
[0110] 对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0111] 需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0112] 本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
[0113] 以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。