本发明涉及软件解析技术,特别涉及一种快速解析海量数据文件的方法。
背景技术:
对于一般在pc机平台下解析数据文件的软件运行步骤主要包括:从pc机硬件平台如硬盘文件读取数据,将读取的数据进行格式分析,并转化为某协议规定的格式(一般为可人工直接识别的格式),最后再将解析转化后的格式保存到输出文件里,供后续文件分析用户使用。
由于一般计算机系统下,文件一般记录在块设备中,所谓块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,例如硬盘,u盘,sd卡等。
那么记录在块设备的文件的读取工作只能按块大小进行操作。以vc 环境下的stdio.h文件fread函数为例,在某次读取数据操作中,如果数据协议规定某包数据长度为100字节,软件在调用fread函数读取100字节后,系统实际是读取块设备里一个块的字节数,一般一个块为512字节或512字节的整数倍数。
这意味着在块设备为基础的环境下,软件执行一次少于一个块长度读数据的时间与执行一次读一个块时间长度相同。而实际情况是一般协议数据包长度往往不会等于一个数据块长度。那么如果按常规思路每次解析一个数据包前用fread函数只读取一个数据包的长度,造成每次系统都会消耗读一个数据块的时间去读取一个数据包长度。如果数据文件本身有几mb字节,多余消耗的时间可忽略;如果是大小超过上gb字节的海量文件,解析整个文件的时间将相当漫长。常规的源码解析软件读数据过程如果操作频繁,将使软件解析进展缓慢,尤其是被解析文件规模海量,达上gb字节时,将会浪费很多时间。
技术实现要素:
本发明的目的在于提供一种快速解析海量数据文件的方法,用于解决上述软件解析进展缓慢的问题。
本发明一种快速解析海量数据文件的方法,其中,包括:从原始文件里读取预定字节或预定字节整数倍长度的字节数一一对应的转换到程序数组变量里;判断从原始文件读取数据操作是否成功,如果不成功则代表文件已到结尾,并结束;如果成功则进入下一步;从已读取的数组变量中,读取一个协议包数据;当成功转换到程序数组变量的个数返回值大于0时,将转换后的各数组变量按相关协议进一步处理,生成解析后的文件,之后再次读取下一个协议包数据;当成功转换数组变量的个数返回值为-1时,证明数组变量已解析到最后几个不能凑满一个协议包的字节数,需要继续从原始文件读取新数据;在读取新原始文件数据前,把之前剩余的未解析的数据转移到数组变量的开头部分,以便与新读取原始文件数据完成拼接,保证之后的协议包数据顺利被解析,读取新的原始文件数据。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,还包括,设置数据块缓冲层,每次读取一个数据块,或若干数据块长度,并将数据临时保存在数据块缓冲层。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,如果字节数不够一个数据块,则只读剩余字节数,之后将临时保存的数据进一步按协议规定的数据包长度进行解析和翻译。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,预定字节为512字节。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,整数倍采用2倍4倍。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,协议包数据是指在原始文件里保存的格式固定的数据。
根据本发明所述的快速解析海量数据文件的方法的一实施例,其中,读取新的原始文件数据完成之后回到判断从原始文件读取数据操作是否成功的步骤,直到结束。
本发明提出一种快速解析的方法该发明方法可以使软件在读数据过程得以优化,提高解析速度,大大节省软件运行时间。
附图说明
图1为一种快速解析海量数据文件的方法流程图;
图2为block[block_index]数组处理示意图;
图3为转移前后的数值示意图。
具体实施方式
为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
为保证每次软件读取数据充分使用,减少底层i/o系统读数据块次数,考虑在软件调用fread函数读取数据块内容基础上,增加一个数据块缓冲层。软件每次不再只读一个数据包长度,而是读取一个数据块,或若干数据块长度,并将数据临时保存。当然要考虑文件实际剩余大小,如果字节数不够一个数据块,则只读剩余字节数。之后将临时保存的数据进一步按协议规定的数据包长度进行解析和翻译。由于临时保存数据在计算机内存里,因此对其进行各项操作所需时间远远小于从块设备读数需要的时间,软件解析文件的速度将得到飞跃性提升。
图1为一种快速解析海量数据文件的方法流程图,如图1所示,一种快速解析海量数据文件的方法包括:
1.程序开始时,从原始文件里读取512字节,或其整数倍长度的字节数到程序内部数组变量里。
补充说明:具体倍数可采用2倍4倍,但倍数太多对总解析时间影响不大。为叙述简便,以下一律以512字节为例进行说明。之所以读取512字节或其倍数,关键在于块设备驱动程序一般是以512字节为倍数进行读硬盘操作的,即程序只读1个字节时,底层驱动程序也是至少读取512字节,读1个字节和读512个字节花费时间相同。因此按此规律进行优化读取文件的方式,是本发明的关键点。接下来的操作主要是保证对程序内部保存的数据进行解析的正确性和连惯性。
2.判断从原始文件读取数据操作是否成功,如果不成功则代表文件已到结尾,程序结束;如果成功则进入下一步。
3.从已读取的块缓冲(数组变量)中,读取一个协议包数据。
补充说明:协议包数据是指在原始文件里保存的格式固定的一行一行数据,它们大致格式如下:
b0x8c10okcmd100:00:39312110400 133000
b0x8800oksts100:00:39312134700 24300
b0x0000okdat100:00:39312154700 20000
…
因此采用标准c语言函数:
_crtimpint__cdeclsscanf(constchar*,constchar*,...);
以下面方式调用该函数,可将原始文件数据一一对应的转换到程序内部变量里,供后续操作使用。
read_count=sscanf((constchar*)&block[block_index],
"%s%x%s%s%ld%ld:%ld:%ld%ld %ld\n",
&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);
该函数一共有12个参数,第1个参数block[block_index]数据为第1步的程序内部数组变量,临时保存从原始文件读取的一块512字节数据。block_index为解析到第几个字节的下标变量。第二个参数为格式化字符串,与原始协议包数据的每一行相对应,用于将原始数据顺利读取到后面的10个参数变量a~j里。a~j为程序内部变量,它们装载原始文件数据格式转换后的数据。
以这下面这一行原始协议包数据为例:
b0x0000okdat100:00:39312154700 20000
sscanf()函数调用后,后面10个参数取值分别为:a=”b“,b=0x0,c=“ok“,d=”dat“,e=1,f=0,g=0,h=39,i=312154700,j=20000。read_count为返回值,大于0时,代表sscanf函数成功转换变量的个数,值为-1时,代表转换失败,block数据提供的变量个数不够。
4.图2为block[block_index]数组处理示意图,如图2所示,当read_count返回值大于0时,将转换后的各变量按相关协议进一步处理,生成解析后的文件,之后再次读取下一个协议包数据;当read_count返回值为-1时,证明block[block_index]数组变量已解析到最后几个不能凑满一个协议包的字节数,需要继续从原始文件读取新数据。
5.在读取新原始文件数据前,需要把之前剩余的未解析的数据转移到block[block_index]数组变量的开头部分,以便与新读取原始文件数据完成拼接,保证之后的协议包数据顺利被解析。然后读取新的原始文件数据。
图3为转移前后的数值示意图,如图3所示,完成之后回到第2步,判断从原始文件读取数据操作是否成功,如此循环反复,直到结束。
基于vc 软件开发环境和pc机平台上的软件开发技术,可扩展并推广至其他需要读取海量文件并解析和翻译数据的软件开发环境。
本发明提出一种快速解析的方法该发明方法可以使软件在读数据过程得以优化,提高解析速度,大大节省软件运行时间。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
1.一种快速解析海量数据文件的方法,其特征在于,包括:
从原始文件里读取预定字节或预定字节整数倍长度的字节数一一对应的转换到程序数组变量里;
判断从原始文件读取数据操作是否成功,如果不成功则代表文件已到结尾,并结束;如果成功则进入下一步;
从已读取的数组变量中,读取一个协议包数据;
当成功转换到程序数组变量的个数返回值大于0时,将转换后的各数组变量按相关协议进一步处理,生成解析后的文件,之后再次读取下一个协议包数据;当成功转换数组变量的个数返回值为-1时,证明数组变量已解析到最后几个不能凑满一个协议包的字节数,需要继续从原始文件读取新数据;
在读取新原始文件数据前,把之前剩余的未解析的数据转移到数组变量的开头部分,以便与新读取原始文件数据完成拼接,保证之后的协议包数据顺利被解析,读取新的原始文件数据。
2.如权来要求1所述的快速解析海量数据文件的方法,其特征在于,还包括,设置数据块缓冲层,每次读取一个数据块,或若干数据块长度,并将数据临时保存在数据块缓冲层。
3.如权来要求2所述的快速解析海量数据文件的方法,其特征在于,如果字节数不够一个数据块,则只读剩余字节数,之后将临时保存的数据进一步按协议规定的数据包长度进行解析和翻译。
4.如权来要求1所述的快速解析海量数据文件的方法,其特征在于,预定字节为512字节。
5.如权来要求1所述的快速解析海量数据文件的方法,其特征在于,整数倍采用2倍4倍。
6.如权来要求1所述的快速解析海量数据文件的方法,其特征在于,协议包数据是指在原始文件里保存的格式固定的数据。
7.如权来要求1所述的快速解析海量数据文件的方法,其特征在于,读取新的原始文件数据完成之后回到判断从原始文件读取数据操作是否成功的步骤,直到结束。
技术总结