大容量存储测试数据显示预处理方法研究

2019-03-19 06:43邓泽平崔建峰梁志剑刘慧丰
测试技术学报 2019年2期
关键词:大容量拷贝测试数据

邓泽平,崔建峰,梁志剑,刘慧丰

(1.中北大学 电子测试技术重点实验室,山西 太原 030051;2.北京特种车辆试验场,北京 100072)

0 引 言

随着现代工业和信息技术的快速发展,各测试领域的测试精度和采样频率都得到提高[1],被测设备的智能化程度越来越高、 系统结构也更加复杂.与此同时,在测试中产生的数据量也随之骤增,在某型号装甲车辆的振动测试中,采样频率为3 000 Hz,每个数据点占用2个字节,经过一个小时采集数据量就达到20 MB以上(仅是车辆测试中一个通道的数据量).由此可见,大容量测试数据的处理成为不容忽视的问题.

目前,对大容量测试数据处理的相关研究已取得较大进展.文献[2]在Windows XP平台上使用Labview 8.5图形化编程软件、 采用多线程技术实现大容量数据的实时采集、 显示和分析; 文献[3]采用分块处理方式实现对大容量数据文件的处理,并在一定程度上提高了程序的执行效率; 文献[4]在CVI平台下使用Windows SDK技术实现了对大容量数据的分析和处理,并使用多线程技术实现软件可靠、 流畅运行.上述研究均实现了对大容量数据文件的处理,在一定场合下可以满足用户的需求.但它们都是通过分块处理方式来处理、 分析大容量数据中的部分数据,无法反映文件中大部分或所有数据的变化趋势,另外在处理大容量数据时还存在效率不高的问题[1,3].

本文以装甲车辆车载测试系统的上位机开发为背景,针对传统大容量数据预处理方法无法反映数据整体趋势、 数据处理耗时较长等问题,提出Max-Min抽样、 内存拷贝、 多线程并行处理等优化方法,在反映数据整体趋势的同时大幅提高程序的运行效率.

1 传统处理方法存在的问题

车载测试系统处理大容量测试数据的传统方法是将数据分块处理: 使用相关的文件操作函数对原始数据进行定位操作,并结合数据长度实现对局部数据的处理、 显示.

在测试数据的可视化过程中,使用传统的抽样方法(等距抽样)抽取的数据存在误差,并且该误差会随着数据量的增加被放大.以装甲车辆振动信号测试为例,对于2 G的测试数据,若振动信号的周期为200 Hz,为使等距抽样获取的数据能够反映数据变化趋势,则在显示测试数据的整体趋势时需要开辟的内存空间约为200 MB.经实际测试,一般的PC设备在同时绘制这么多数据点时会造成程序卡顿甚至卡死.因此,等距抽样方法无法实现对大容量数据整体趋势的显示.

分析传统大容量数据处理方法时,对数据处理耗时进行实测统计(大容量数据文件是分块进行处理的,每个数据文件分为173个数据块进行处理),结果如表 1 所示.

从表 1 可以看出使用常规方法处理数据时,数据抽样耗时为解码耗时的3~4倍,读取数据的耗时随文件容量的增加近似呈线性增长.随着测试数据量的增加,传统数据处理方法的弊端开始显现出来: 数据量增大到一定程度时,处理数据的时间可能会超出用户的忍耐限度[3],导致软件的用户体验较差.因此,对大容量数据处理方法进行优化是非常必要的.

2 改进的大容量数据处理方法

针对上述问题提出Max-Min抽样、 内存拷贝和多线程并行处理方法,其中使用Max-Min抽样方法显示大容量测试数据的整体变化趋势,内存拷贝和多线程并行处理则用于提升数据处理效率.用改进方法处理大容量数据流程如图 1 所示.

图 1 改进方法数据处理流程Fig.1 The optimized method of processing data

2.1 Max-Min抽样

由于本文处理的数据量非常大,传统的数据抽样方法(等距抽样)已无法准确显示数据的整体变化趋势.因此,使用Max-Min抽样方法来获取显示数据,即对数据分块处理,选取每个数据块中最大、 最小值反映该数据块的变化趋势.采用该抽样方法获取的数据量与显示区域的宽度相关,在无需考虑显示数据占用内存大小的情况下反映大容量数据的变化趋势,能够定位用户关注的局部数据,以便进一步查看.

2.2 数据解码

测试数据以二进制的形式存储在磁盘文件中,通过FileStream[5]的Seek和Read函数把数据读入byte数组中,然后进行数据解码,即获取测试数据对应的基元数据类型.C#语言获取内存中byte数组对应基元类型数据时,常用的方法是调用静态类BitConverter的ToDouble、 ToInt32等函数.该数据转换方法的缺点是仅支持对单个对象的操作,处理大量数据时函数调用过于频繁,数据转换效率较低.

为提高数据解码效率,使用内存拷贝方式代替上述数据转换方法,具体做法是通过调用Buffer.BlockCopy函数,其函数原型如下所示.

public static void BlockCopy(Arraysrc, intsrcOffset, Arraydst, intdstOffset, intcount),其中src表示源缓冲区,srcOffset表示src的字节偏移量,dst表示目的缓冲区,dstOffset表示dst的字节偏移量.Buffer.BlockCopy函数可以实现字节数组和基元类型数组之间的相互转化,相当于C语言中使用指针访问基元类型数组,使数据转化效率得到很大提高.

使用内存拷贝对每个数据块处理时解码和采样消耗的时间如表 2 所示,对比改进之前(表 1)可以看出处理每个数据块时,数据解码的耗时明显减少.

表 2 使用内存拷贝方法处理数据的实测耗时

2.3 多线程并行处理

从表 1 和表 2 中可以看出在数据处理过程中,数据抽样的耗时占很大比重.通过使用内存拷贝方法,虽然提升了数据解码的效率,但是对于大容量测试数据的整体处理过程而言,效果仍不明显,数据处理耗时依然较长.

针对处理大容量测试数据耗时较长的问题,在分块处理基础上提出并行处理方法[6].通常情况下,使用并行方法处理任务时,各子任务之间不应存在依赖或顺序关系,因为各线程处理结果的输出顺序是不确定的.然而本文将大量数据分配到多个子任务进行处理,这些子任务的处理结果之间存在一定顺序关系.

为解决上述问题,使用System.Threading.Tasks程序集中的Parallel.Invoke方法,具体实现过程如下.

1) 定义double类型的数据集合resultData,用于存放最终结果; 同时定义n个double类型的数据集合subResult_1、subResult_2、 …、subResult_n,存放n个线程各自的处理结果;

2) 计算子任务分配时需要的相关信息,主要信息的计算如下所示.

(1)

(2)

(3)

ltn=cn-(n-1)×ptn,

(4)

式中:cn为分割的数据块数,w为显示区域宽度,pcl为每个数据块的数据点数,e和b分别为处理数据的起始、 终止位置,ptn为除最后一个子任务外每个子任务处理的数据块数,ltn为最后一个子任务处理的数据块数,n为分配的子任务数;

3) 调用Parallel.Invoke函数,创建多个子任务,并将各子任务的处理结果存放至subResult_1,subResult_2等;

4) 对步骤3)中n个数据集进行整合,将最终结果存放至resultData.

本文实现的多线程并行技术是在双核、 四线程的PC设备上完成的,该设备在同一时刻最多可以同时执行4个线程.为进一步查看程序中开辟线程数和数据处理时间的关系,图 2 对分配不同子任务的情况进行对比,从中可以看出: 随着开辟线程数的增多,处理数据的时间先减少而后增加,分配4个任务处理数据的用时最少.数据处理程序中开辟线程数少于4个时,由于未能充分利用CPU以至数据处理效率不能达到最高; 开辟线程数多余4个时,CPU可能需要在各线程之间切换而增加额外开销,因此在开辟4个线程处理数据时耗时最少.

图 2 多线程处理数据用时对比Fig.2 The caparison of elapsed time through multithreading parallel processing technology

3 性能分析

在大容量测试数据可视化过程中,使用Max-Min抽样方法可以反映大量测试数据的整体变化趋势.从表 1 和表 2 的用时对比中可以看出: 使用内存拷贝方式来处理每个数据块时,原始数据的解码时间明显减少; 同时从图 1 中可以看出: 使用多线程并行处理技术可以极大地缩短数据处理的整体时间.

优化前后数据处理用时如表 3 所示,可以看出在使用内存拷贝和多线程并行处理的方法后,数据的处理效率有大幅提升,达到60%以上.以处理2 GB的数据文件为例,用户对图形显示软件操作之后(数据处理方法优化前),等待3~4 s的响应时间是不能忍受的,使用内存拷贝方法和多线程并行处理技术之后将用时降至1 s左右,数据的处理效率明显提升.本文提出的大容量测试数据处理方法已应用于某装甲车辆测试系统的上位机软件中,某通道测试数据经放大后显示效果如图 3 所示.

表 3 优化前后处理数据的实测用时对比

图 3 车载测试系统历史数据显示Fig.3 The display of vehicle test system channel data

4 结 论

对于车载测试系统的上位机软件而言,数据的处理效率是必须要考虑的,尤其在处理大容量测试数据时.本文主要对传统数据处理方法的进行三方面的改进: ① 采用Max-Min抽样方法; ② 使用内存拷贝方式来解码原始数据; ③ 使用多线程并行处理技术来处理大容量数据文件.在显示大容量数据整体变化趋势的同时大幅提高数据的处理效率,对于处理大容量测试数据的问题具有参考价值.

然而,本文所提出的处理方法仍存在一定局限: 当待处理的数据量达到4 GB或更多时,用户在使用软件时则会感觉到较长延时.处理该问题时需要使用更多的先进技术[7],例如: 内存映射技术[8-9]、 Storm和Mapreduce等大数据处理技术[10],以此进一步提高大容量数据的处理效率,这些是后续工作中需要研究的内容.

猜你喜欢
大容量拷贝测试数据
大容量同步电机低比转速离心风扇的设计与数值分析
测试数据管理系统设计与实现
唐氏综合征是因为“拷贝”走样了
航空用大容量锂离子电池研究
12-20升大容量PET瓶装式吹瓶机
文化拷贝应该如何“拷”
基于自适应粒子群优化算法的测试数据扩增方法
空间co-location挖掘模式在学生体能测试数据中的应用
基于大容量指纹识别的实时身份认证系统
影响《标准》测试数据真实性的因素及破解策略