一种文件读取方法和电子设备与流程

文档序号:16308441发布日期:2018-12-19 05:10阅读:214来源:国知局
一种文件读取方法和电子设备与流程

本发明涉及性能压测领域,尤其涉及一种文件读取方法和电子设备。

背景技术

在网络技术中常采用顺序参数化对网络进行性能压测,在顺序参数化中,参数用于构造集合,施压过程中会将参数来源中的值动态替换为指定值,在读取文件记录时,每个压测线程按顺序读取参数化文件,顺序压测规则性强,可以替代随机读取文件,并且顺序参数化还能应用于造数据等特殊场合,同时压测数据和数据应用方式的不同可以使压测过程应用于不同的真实场景。而,传统顺序参数化方式主要针对小文件,将小文件一次读取到内存中,但在实际的性能压测过程中,文件大小是无法预知的,也就不能线路的稳定性,一次读取到内存的做法简单可靠,但性能平台限制了文件大小的使用,同时在压力测试页面加载和页面切换过程中,存在线程等待,使得在页面加载和切换过程中流量qps不稳定。



技术实现要素:

针对以上问题,本发明公开了一种文件读取方法和电子设备,使得压测过程满足在顺序读取文件时文件大小不受限制、页面加载切换过程中流量qps稳定、读取速度快,内存消耗少等需求。

本发明提供了一种文件读取方法,包括:

s1,将该文件分成多页;

s2,采用至少一个线程顺序读取多页,其中,线程从全局缓存读取完第n-1页时,从二级缓存中读取第n页的内容,同时,在全局缓存中加载第n页的内容,n为大于1的整数;

s3,在全局缓存中加载第n页的内容完毕后,线程从全局缓存中读取该n页中剩下的内容,其中,剩下的内容是指第n页中未从二级缓存中读取的内容。

可选地,在步骤s1之前还包括:

s0,判断所述文件的大小,若该文件行数小于等于阈值时,则直接读取数据,若该文件行数大于阈值时,则执行步骤s1。

可选地,步骤s2中,采用至少一个线程顺序读取多页,包括:

采用至少一个线程按行读取多页的每一页,其中,采用滑动窗口对每页的行进行定位。

可选地,步骤s2中,采用至少一个线程顺序读取多页,包括:

采用多个线程异步读取多页。

可选地,步骤s2,从二级缓存中读取第n页的内容,包括:

每个线程均包含一个二级缓存。

本发明还提供了一种电子设备,包括:

处理器;

存储器,其存储有计算机可执行程序,该程序在被处理器执行时,使得处理器执行:

s1,将该文件分成多页;

s2,采用至少一个线程顺序读取多页,其中,线程从全局缓存读取完第n-1页时,从二级缓存中读取第n页的内容,同时,在全局缓存中加载第n页的内容,n为大于1的整数;

s3,在全局缓存中加载第n页的内容完毕后,线程从全局缓存中读取该n页中剩下的内容,其中,剩下的内容是指第n页中未从二级缓存中读取的内容。

可选地,其中处理器执行分页技术之前还执行:

s0,判断所述文件的大小,若该文件行数小于等于阈值时,则直接读取数据,若该文件行数大于阈值时,则执行步骤s1。

可选地,其中处理器顺序读取多页,还执行:

采用至少一个线程按行读取多页的每一页,其中,采用滑动窗口对每页的行进行定位。

可选地,其中处理器顺序读取多页,还执行:

采用多个线程异步读取多页。

可选地,其中存储器包括:

每个线程均包含一个二级缓存。

本公开的另一方面提供了一种计算机可读介质,存储有计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。

本公开的另一方面提供了一种计算机程序,所述计算机程序包括计算机可执行指令,所述指令在被执行时用于实现如上所述的方法。

本发明主要解决压力测试过程中顺序模式读取文件时大文件的限制,压测过程中流量qps抖动等问题题,运用本发明文件大小不再作为瓶颈,并且压测过程qps抖动较小,可以很好的应用在压测平台中对数据顺序有要求的特定场合。

附图说明

为了更完整地理解本公开及其优势,现在将参考结合附图的以下描述,其中:

图1示意性示出了根据本公开顺序读取参数化文件的流程图。

图2示意性示出了根据本公开顺序读取参数化文件的操作步骤图。

图3示意性示出了根据本公开实施例二级缓存流程图。

图4示意性示出了根据本公开的电子设备框图。

具体实施方式

以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。

在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了所述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。

在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。

附图中示出了一些方框图和/或流程图。应理解,方框图和/或流程图中的一些方框或其组合可以由计算机程序指令来实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,从而这些指令在由该处理器执行时可以创建用于实现这些方框图和/或流程图中所说明的功能/操作的装置。

本公开的实施例提供了一种顺序读取参数化文件的方法和电子设备,采用分页技术让大文件任何记录都可以加载到内存,使大文件的读取不再存在限制;同时采用滑动窗口机制,让文件加载迅速从文件的当前行数的下一行加载,减少定位文件行数的时间,加速压力测试过程对文件的读取,同时加载过程中采用线程局部二级缓存,切换页面时使快线程首先从二级缓存中加载,让快线程适当变慢,让慢线程追上,避免因为快线程每次都切换页面,让慢线程只能溯源到文件从新读取,导致慢线程一直慢下去的缺陷,从而使得在加载页面时压力测试流量qps保持稳定;另外,本发明采用异步方式提前加载页面,使页面加载无需等待,进一步减少压测过程中因为加载文档导致压测流量qps剧烈波动。

图1示意性示出了顺序参数化性能压测流程图,如图1所示:首先区分加载文件的大小,如果为行数小于等于10万行的小文件,则直接读取该文件进入内存中,读取时直接顺序读取即可,每读取一次记录数加1,直至读取完毕;

如果为记录行数大于10万行的大文件,当当前记录数小于页面行数时,直接从全局缓存中读取数据,如果当前记录数大于等于页面行数时,采用异步加载方式,每个线程持有一个100条数据的二级缓存,当无法从进程内共享大页面中读取到数据,则快速从二级缓存文件加载100条数据出来,而非加载10万行记录,且压测线程读取文件慢的线程无需加载页面,能慢慢赶上读取页面速度较快的线程,压测过程qps抖动较小。快线程首先读取其内存中的二级缓存,如果二级缓存中含有指定记录则直接读取二级缓存中记录,如果该二级内存中不含指定记录,则同步加载二级缓存页面到线程内存中,并且需要进一步更新线程内存中的数据,而后再读取二级缓存中的记录,更新二级缓存的bufferreader和index,读取完成后记录数加1,当记录数超过文件记录行数时,记录数清零,结束读取。

如图2所示为顺序参数化性能压测过程的操作步骤图,如图2所示,具体包括:

s1:将该文件分成多页。

首先需要判断文件的大小,按文件行数进行大小区分,小于等于10万行记录代表小文件,区分方式一次读取一页数据到内存,当到达文件结尾,则标记为小文件。

针对小文件,首次调用方法加载文件记录到进程内存中,后续每次读取速度较快,根据每个线程的recordindex读取线程对应记录即可,当到达文件结尾时返回,执行程序如下:

privatevolatilethreadlocal<map<string,object>>localdatathreadholder;

为了保证线程之间统计数据的独立性,采用threadlocal记录各个线程当前读取记录位置,map中key=accumulator,value=integer。

integeriaccumulator=filerecordassist.getthredaccumulator()==null?0:filerecordassist.getthredaccumulator();

filerecordassist.setthredaccumulator(iaccumulator+1);

当到达文件结束时,标记置位0。

当文件行数大于10万行记录时代表大文件,对大文件进行分页处理,分页机制如下:

privatevolatilemap<string,object>mdata=null;

map缓存每一页的三种数据:

key=datacontainer;value=list缓存当前页的数据;

key=databeginindex;value=integer,缓存当前首行在文件中的行数,用于循环加载页;

key=bufferreader;value=bufferreader文件指针,存储的是当前页下一行文件的位置fseek;以上三种数据可以完整的抽象一个页数据。

通过以上分页技术,大文件的读取不受限制,使压力测试数据更加符合实际过程。

s2,采用至少一个线程顺序读取多页,其中,线程从全局缓存读取完第n-1页时,从二级缓存中读取第n页的内容,同时,在全局缓存中加载第n页的内容,n为大于1的整数;

加载过程中采用滑动窗口进行页面的加载,滑动窗口使文件加载迅速从文件的下一行进行加载,减少了定位文件行数的时间,滑动窗口主要是解决性能测试平台加载大文件时避免每次加载页都重新打开一个bufferreader,bufferreader存储的本身就是当前页的下一行位置,因此采用滑动窗口减少了读取时间,同时减少了不必要的等待,使的读取过程更加快速高效。。

s3,在全局缓存中加载第n页的内容完毕后,线程从全局缓存中读取该n页中剩下的内容,其中,剩下的内容是指第n页中未从二级缓存中读取的内容。

首先建立全局缓存,该全局缓存中的数据在对所有线程开放共享,建立机制如下:

privatevolatilemap<string,object>mdata=null;

进程级别所有压测线程共享,mdata中:

key=datacontainer,value=list<string>缓存10万行记录;

key=databeginindex,value=integer标记大文件分页起始索引;

key=bufferreader,value=bufferreader文件指针,这几个数据是滑动窗口抽象数据对象。

建立二级缓存,对于分页后的文件,每页进程内所有压测线程共享读取全局缓存,进程内所有线程读取文件速度有快有慢,如果设置线程集合点,那么压测过程中线程qps肯定会因为文件加载而出现下降,无法满足qps稳定要求,考虑二级缓存,每个线程持有一个100条数据的小缓存,当无法从进程内共享大页面中读取到数据,则快速从文件加载100条数据出来,而非加载10万行记录,且压测线程读取文件慢的线程无需加载页面,能慢慢赶上读取页面速度较快的线程,采用二级缓存技术,无需设置线程集合点,快线程无需等待慢线程,使的所有线程不存在不必要的停留等待,因此压测过程qps抖动较小,二级缓存建立机制如下:

privatevolatilethreadlocal<map<string,object>>localdatathreadholder;

首先localdatathreadholder是个线程变量threadlocal,存储以下几个关键数据:

key=localebufferedreader,value=bufferedreader;

key=localecontainer,value=list<string>线程二级缓存对应记录容器;

localebeginindex;value=integer线程对应二级缓存页起始索引,保证滑动窗口运行,二级cache抽象数据对象。

图3示意性示出了二级缓存流程图,由3图可以看出,二级缓存过程如下:

首先假设在时间1时,施压进程有多个线程,线程1、2、n都从当前进程中全局共享的内存也n-1中读取数据,这个时候注意到线程1读取数据较快,已经到读取到了页面n-1的末尾处,而线程2稍微慢点,还有一批数据没读取完,线程n最慢;此时3个线程还是从全局缓存中读取数据。

紧接着线程1发现页面n-1中已经没有要读取的数据了,这个时候线程1进程异步触发下一页动作;同时如果后面其他线程也读取完了要触发切页动作,要防止重复切页。采用double-check防止重复切页。但是线程1切换页面动作时加载10万行数据要加载一段时间,这个时候需要线程1还是尽量返回需要的数据,这里采用到了本次顺序参数化大文件的核心,二级cache。这里加载二级cache采用同步加载方式,这里又带来了一个问题,仍然要采用滑动窗口技术,避免文件超大,每次加载二级cache都从文件首行开始,线程1在加载页面n时后面每次读取都从局部缓存中读取。线程2和线程n这个时候页面n-1的记录没有消耗完毕,仍从全局缓存中读取数据。执行快的线程1这个时候已经慢了下来,线程2和线程n已经慢慢追上线程1。

时刻3中,页面n已经加载完成,可以进行替换,并置空页面加载标记,让后面页面加载可以正常运行。线程1后续读取数据仍然从全局缓存中读取,线程2这个时候也刚好可以从页面n中读取,但最慢的线程n发现页面n-1已经丢失,这个时候线程n也需要加载自己的局部缓存,最后从局部缓存中将页面n-1数据读取完毕,后续仍然从全局缓存中读取数据。

二级chche很好的解决了压测平台进行顺序参数化大文件压测时,页面切换导致qps下降的问题,让线程步调尽量在一个水平线上。

综上所述,本发明采用分页技术对大文件进行分段处理,分成多页,在压力测试读取过程中逐页读取,使的文件大小不再是压力测试过程中的限制,同时采用在加载和切换页面时采用滑动窗口、二级缓存和异步加载方式,减少了压测过程中的定位和等待,使的压测过程中读取速度快、内存占用小,流量qps抖动小。

图4示意性示出了根据本公开实施例的适于实现本公开的方法的计算机系统的框图。图4示出的计算机系统仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图4所示,电子设备400包括处理器410,计算机可读存储介质420。该电子设备400可以执行根据本公开实施例的方法。

具体地,处理器410例如可以包括通用微处理器、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(asic)),等等。处理器410还可以包括用于缓存用途的板载存储器。处理器410可以是用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。

计算机可读存储介质420,例如可以是能够包含、存储、传送、传播或传输指令的任意介质。例如,可读存储介质可以包括但不限于电、磁、光、电磁、红外或半导体系统、装置、器件或传播介质。可读存储介质的具体示例包括:磁存储装置,如磁带或硬盘(hdd);光存储装置,如光盘(cd-rom);存储器,如随机存取存储器(ram)或闪存;和/或有线/无线通信链路。

计算机可读存储介质420可以包括计算机程序421,该计算机程序421可以包括代码/计算机可执行指令,其在由处理器410执行时使得处理器410执行根据本公开实施例的方法或其任何变形。

计算机程序421可被配置为具有例如包括计算机程序模块的计算机程序代码。例如,在示例实施例中,计算机程序421中的代码可以包括一个或多个程序模块,例如包括421a、模块421b、……。应当注意,模块的划分方式和个数并不是固定的,本领域技术人员可以根据实际情况使用合适的程序模块或程序模块组合,当这些程序模块组合被处理器410执行时,使得处理器410可以执行根据本公开实施例的方法或其任何变形。

根据本公开的实施例,计算机可读存储介质例如可以是-但不限于-电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线、光缆、射频信号等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合或/或结合,即使这样的组合或结合没有明确记载于本公开中。特别地,在不脱离本公开精神和教导的情况下,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合。所有这些组合和/或结合均落入本公开的范围。

尽管已经参照本公开的特定示例性实施例示出并描述了本公开,但是本领域技术人员应该理解,在不背离所附权利要求及其等同物限定的本公开的精神和范围的情况下,可以对本公开进行形式和细节上的多种改变。因此,本公开的范围不应该限于上述实施例,而是应该不仅由所附权利要求来进行确定,还由所附权利要求的等同物来进行限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1