过程数据的压缩与存取系统构建策略
2018-09-22方宗顺
方宗顺
(中石化扬子石油化工有限责任公司,江苏 南京 210048)
过程数据是非常宝贵的信息资源,在生产过程中加以挖掘并广泛应用于如设备运行监控、故障检测与远程智能诊断、质量实时控制、反馈控制等许多过程运行和控制任务场合[1]。随着企业的设备数量越来越多、信息采集与控制技术的进步、计算机及网络技术的发展,以及生产过程更加高效、安全的运行要求,使生产过程中的数据量剧增,产生了海量过程数据存储与实时多任务并发读取的需求[2]。
过程数据压缩和重建是过程数据管理的重要组成部分,过程数据压缩一般要遵守基于逼近误差和显著特征的保真度准则,像地震领域的大数据和语音压缩算法以及传统的图像压缩算法都不能满足过程数据采集速度和压缩质量的要求。Hale等[3]阐述了实时数据压缩的优点,并提出了矩形波串法(box car)和后向斜率法,使人们认识到了过程数据压缩的重要性。随后,Bristol提出了旋转门趋势(swinging door trending, SDT)算法,Mah等[4]对SDT算法进行了改进,提出了一种分段线性在线趋势化(piecewise linear on-line trending, PLOT)算法。这几种算法的本质是进行分段线性插值,将实际信号与压缩信号之间的局部误差控制在给定范围之内。
本文采用基于非关系型的开源的BDB(Berkeley data base),实现对过程数据的分布式存取管理。其突出优点是数据存取算法易实现、执行速度快、支持多操作系统、支持海量数据存储(数据存储容量达到256TB)[5]。同时,本文给出SDT压缩算法的API软件层代码实现,采用 Windows 通讯开发平台(Windows communication foundation, WCF)技术开发分布式数据存取中间件,以此构建了过程数据存储系统,并应用于某石化企业的计量监控系统,与其他不同类型数据库存储系统相比,BDB在过程数据领域有很大优势。
1 数据处理与存储软件结构
1.1 嵌入式开源数据库BDB
BDB是一个开源的文件型嵌入式数据库,通过内嵌在程序中的函数库完成对数据的增加、修改、删除操作。它包含5个子系统:存取管理子系统、内存池管理子系统、事务处理子系统、加锁子系统及日志子系统,结构如图1所示。由关键字及数据构成的Key/Data构成BDB的基本结构单元,数个这样的结构单元构成数据库整体[6]。
图1 BDB数据库子系统
BDB具有如下突出优点:
1)嵌入式(eebedded)。直接链接到应用程序中,对数据库的操作就是对操作函数的调用。为几乎所有常见编程语言提供API接口。多个进程,或者同一进程的多个线程可并发操作数据库[7]。
2)轻便灵活(portable)。不仅可以运行于Windows操作系统下,还可运行于如Linux、UNIX及其他嵌入式实时操作系统之下。
3)可伸缩(scalable)。能够管理高达256TB规模的数据库,动态库文件自身却非常精简,支持高并发度。
存储在BDB中的数据结构简洁明了,可以保存任意类型的键/值对(Key/Value Pair),而且可以为一个键保存多个数据。
本文采用BDB存储生产过程中采集的实时数据及文件、图像等流数据。访问BDB流程为:定义数据的结构体,创建数据库表访问句柄,通过open函数打开数据库,根据定义的结构体创建Key/Data对象,调用put函数插入记录,调用get函数查询记录。程序关闭时关闭创建的数据库句柄。
1.2 数据压缩与存取总体构建
图2为基于BDB的数据采集与压缩存储、分布式查询提取的软件结构框图。数据通道将采集的设备监控数据送入数据预处理模块,更新一部分断面数据到缓存内存区,然后根据SDT算法进行数据压缩,并将压缩数据通过数据总线交给数据存储服务API层,API层将压缩后的数据存入BDB。归档服务会定期识别BDB中的非活动数据并将其转移到其他设备中[8]。当人机交互软件请求查询采样数据时,基于WCF的中间件服务层会先对BDB中的压缩数据解压,然后将数据发送给软件。
图2 数据压缩存取软件结构图
2 SDT数据压缩算法分析
一个良好的实时数据库,必须处理好实时数据的压缩问题,才能使系统的整体性能达到海量数据存储的实时性要求。数据压缩算法流程如图3所示。
图3 数据压缩算法流程
一般的数据压缩算法都是通过对数据编码和解码来进行压缩和解压,不同的压缩算法主要的不同点就在于采用的编码方式不同。比较常见的是查字典法,字典中包含了许多与实际数据对应的编码数据,通常情况下实际数据所对应的编码数据都比原数据占用更小的空间,通过对应关系将实际数据转化为编码数据从而达到压缩的目的[9]。
2.1 旋转门压缩算法模型
实时数据库中,数据瞬时采集量巨大且相似度高,作为线性拟合的一种简便算法,即旋转门趋势(SDT)算法[10-11],具有速度快、易实现、高压缩、误差可控等优点,已成为一种专门算法[12]。
SDT算法形象地说就是构建许多高度(有损压缩的阈值)固定的平行四边形,用这些四边形去“覆盖”数据,当数据超出四边形的范围时,归档(存储)数据点。图4中不断“膨胀”的平行四边形就是旋转门,任意时刻该旋转门的宽度都为阈值的2倍。每次扩大后,都要判断是否所有的数据点都能被平行四边形所覆盖,若不能完全被覆盖,则扩张前的所有数据点就需要被归档(压缩)[13]。
本文采用的SDT算法是一种直线趋势化压缩算法,其实质是将一组连续的数据点用一条确定了起点和终点的直线替代。该算法需要使用时间间隔量、起点数据和终点数据3个参数, 其中下一段的起点数据与前一段终点数据相同。图4为其基本原理图。
图4 旋转门压缩算法原理图
设ΔE为SDT算法的压缩阈值,其压缩原理为:起点t0为上一存储结束的数据点,将与t0相距ΔE的上下两点作为轴点,建立一扇有两个门板的门,只有一个数据时门闭合;随着数据点的增加,两个门板会绕着轴点打开,门板的宽度可扩展,门只能朝着打开的方向旋转;只要两个门板的内角和小于180°(两个门板未平行),旋转操作就可以继续;一旦门板的内角和大于等于180°,就结束开门的操作,存储前一点数据,并将该点作为下一压缩操作的起点。
在图4中经过旋转门压缩后,压缩段1由t0~t4的直线代替了t0~t4的数据点;压缩段2由t4~t7的直线代替了t4~t7的数据点。
SDT压缩算法主要步骤如下:
Step2,计算斜率S1,S2,Sj。
Step3,确定S1new,S2new的值。S1new=max(S1,S1new);S2new=max(S2,S2new)。
Step4,判断数据是否需要存储。如果S1new≥S2new,储存前一刻值数据值D(j-1)与对应时刻T(j-1),否则返回Step3。依次循环,直至达到强制记录极限(FSRL),结束当前循环,开始新一轮压缩。
2.2 压缩数据重建
压缩数据重建是将压缩数据还原成原始数据。旋转门压缩算法属于有损压缩,因此解压缩后的数据与原始数据存在误差。压缩设定了阈值ΔE,因此还原误差不会超过2ΔE。相较压缩算法,重构还原算法要简单得多,本质上就是线性插值。设待解压数据分为n段,D(i)中存放每段的长度,R(i)中存放i个数据点,Z(i)存放还原后的数据,i=1,2,…,n,(n+1)。数据还原算法步骤为:
Step1n=1,i=1;
Step2incr=0.0+[R(i+1)-R(i)]/D(i),k=1;
Step3Z(n)=R(i)+incr× (k-1),k=k+1,n=n+1;
Step4 if (k>D(i)) Then Step5,Else Step3;
Step5i=i+1;
Step6 if (i=n) Then Step2, Else Return。
3 数据存取关键技术实现及应用
3.1 系统构建
某石化计量监控系统数据采集存储需求为:总计30 450个I/O点的数据,I/O点数据存储时间间隔为5s,24h不间断存储,存储时间1a以上,数据查询刷新时间小于2s。其中多区域质量流量计230台,每台质量流量计采集65个I/O点的数据,多区域罐150个,每个罐采集50个I/O点的数据,多区域PLC控制系统4套,累计采集2 000个I/O点的数据。多区域视频流采集点50个,存储时间大于6个月。
按1a时间计算,以上I/O点的数据总量大于8TB,按照常规思路按点存储,数据的存储与提取无法满足实时性需求。本文基于BDB存储I/O点数据,采用SDT动态数据压缩及重建算法,结合WCF技术封装数据的提取中间件,以此构建计量监控系统。图5为分布式存储数据结构,区域1~区域m为独立的前端采集存储I/O点数据服务器,压缩数据存储在BDB。区域1~区域m的独立的BDB数据与集中存储服务器的BDB数据实时同步。基于压缩数据重建API函数,采用WCF技术构建数据提取及适合于业务流的中间件,供计量监控系统软件客户端调用。
图5 计量监控系统分布式存储结构
3.2 数据同步技术实现
数据存储区域服务器主要实现:
服务1,采集数据并压缩,按Key/Data配置好数据结构并结合时间戳,存储到BDB对应的表中;
服务2,实时监控BDB对应表中数据的变化,一旦数据有变化,建立socket监听端口,执行与集中存储服务器的连接操作,将变化且未传的数据存储到集中存储服务器的BDB对应表中,并更新上传标志。
其中服务2采用了多线程的方式,包括1个主线程和2个子线程。主线程主要监听数据的变化及进行数据同步。子线程1用来侦听存储服务器的连接请求,如果有请求就与服务器建立连接;子线程2负责在已建立的连接上将变化的数据交给rep_process_message函数处理。3个线程之间相互独立运行。具体流程如图6所示。
图6 数据同步流程图
3.3 数据交互中间件设计
供客户端及第三方软件应用的中间件的功能及流程为:基于WCF的异构系统间交互数据,接收外界并行请求,然后执行处理,并且在集中存储服务器端BDB重建并封装请求的数据,最终返回外界客户端显示。
WCF整合了.NET平台下与通信服务相关的所有内容,支持多种契约方式与服务运行方式,具有可靠性、统一性、互操作性和兼容性等优点,提供多种类型的消息编码及多种协议的消息传递。地址(address)、绑定(binding)和契约(contract)是WCF的三要素,必须对它们进行指定才能用WCF进行通信[14]。地址指的是WCF的服务器地址,契约则表示双方要进行交互的内容,绑定则是指双方以什么样的方式进行交互。为了能在不同的网络和环境下实现分布式访问,WCF支持多种绑定方式[15]。
数据交互中间件主要包括注册、验证数据、数据处理及更新反馈功能模块。注册模块实现数据交互系统间的IP、端口号等基本信息及交互信息的管理功能,配置文件、保存设置的信息。验证数据模块提供对要操作数据的格式验证。数据处理模块主要工作是对请求方的格式进行验证、解析,并将请求转发到提供方,调取数据重建API函数从BDB提取数据,并封装成指定数据结构,同时将处理后的消息通过平台反馈给请求者。更新反馈模块实现了更改配置信息通知等功能,并定期给注册到该平台的关联系统转发系统配置文件。图7为数据交互实现流程。
图7 数据交互实现流程
3.4 测试分析
编写并发存储、并发读取和边存储边读取的测试程序,对BDB和SQL server数据库进行比较,整理测试结果,见表1。结果表明,采用BDB速度较快,且数据量越大效果越明显。
表1 数据存取时间对比
采用SDT算法,基于BDB压缩存储及数据重建,对采集的I/O点数据存取性能指标进行计算,得到的计算结果见表2。表中数据1样本为罐信息7 500个I/O点的数据,数据2样本为质量流量计采集的14 950个I/O点数据,数据3样本为PLC系统2 000个I/O点的数据。结果表明,在对实际过程数据进行处理时,使用SDT算法可以明显地减少数据占用的空间,降低现场总线网络出现阻塞的可能性,提高控制监控系统的性能、数据存取的效率及实时性。显著缺点是数据为有损重建。
表2 I/O点过程数据压缩性能结果
4 结束语
本文将BDB与SDT算法结合,达到了提高数据存取效率、减少数据占用空间的目的。结合WCF技术,构建的分布式数据存取系统[16]解决了大型实时数据存储提取实时性不高的问题,已应用于某石化企业的过程数据SCADA系统。因本文的SDT算法为有损数据压缩重建,难以满足计量数据的一致性要求,下一步将对数据压缩的无损算法及异构系统服务缓存机制加强研究。