本发明属于自动化控制技术领域,尤其涉及一种用于从实时数据库中获取历史数据并高效管理的文件格式存放数据的方法。
背景技术:
现代自动化控制系统规模越来越大,处理能力越来越强。其支持的点数数也越来越多。由此产生的数据量就更加庞大。历史数据库负责数据的收集,将需要的数据保存到磁盘上,并提供查询。
目前,自动化控制系统的历史数据库大多采用成熟的商用数据库,如ACCESS、SQL SERVER、Oracle、Sybase等。但是,对于提供趋势查询的历史数据库,由于对变化较快的过程量,其采样频率也相应的增高,比如一秒,这样对于有上万个点的系统来说,其一天的数据条数将达到亿级别。这样高的数据量和频率,如果用商用数据库来存储管理,那将会是一个很大的负担,占用过多的系统资源,同时,商用数据库不能满足历史数据收集的时限性要求。而且,商业数据库不提供压缩功能,这对不断增多的历史数据存储是个很大的难题。
另外,历史数据的存储主要依赖硬盘,但对于有大量的存盘数据,存盘速度对高频率访问硬盘的影响是不利的。
技术实现要素:
针对现有技术存在的问题,本发明提供了一种历史数据收集及存储的方法。
本发明是这样实现的,一种历史数据收集及存储的方法,提供一种自定义的数据存储文件格式,通过缓冲区来减少磁盘I/O次数和提高系统的实时性能,通过新的文件存储格式和文件存放组织形式来提高数据查询效率,并且可通过压缩工具来压缩数据以减少磁盘空间占用。
为了实现上述目的,本发明的实施例提出了一种历史数据收集及存储的方法,在系统开机时,历史服务进程启动。首先加载全变量历史库收集索引表,该表由工程师站组态编译下装而来。根据采集点个数和数据值存储大小以及采集周期来确定待采集数据的十分钟大小,并据此创建两个内存缓冲区。然后对收集索引表进行初始化;程序运行时根据索引表周期收集各个点项的数据值并记录数据库信息。运行时要周期性判断当前的收集内存区是否满十分钟,当满十分钟时,就要进行换区,空的用来存储新的数据,满的则转储到磁盘文件。这样两个缓冲区,交替进行收集和转储。
进一步,每个磁盘文件都是一个独立的文件,他们有自己的索引结构,用来独立提供对本文件数据点的查询,即根据索引表和给定时刻就可以确定某个点的数据在整十分钟的位置。
进一步,以日期来命名文件夹,具体是xxx年xx月xx日,文件夹下包含当天所有的整十分钟数据文件。每个磁盘文件的命名是该文件的收集起始时刻在一天24小时中所处的第几个十分钟的序号来命名的,这样查询时,根据查询时间,可以快速定位到目标文件,提高查询效率。
进一步,开机时,历史库进程读入组态生成的索引文件到内存,并根据索引文件初始化各索引部分。
进一步,根据所有需要收集数值的变量个数和采集周期以及每个值的大小,确定十分钟内存数值缓冲区的大小,然后据此创建两个相应大小的内存缓冲区;
进一步,包括两个内存缓冲区,分别为#0和#1号区,当一个收集满时,另一个开始收集,收集满的则开始转储到磁盘文件,一个缓冲区存储为一个独立的磁盘文件;根据数据收集时间的起始时刻折算成其在24小时中处于第几个整十分钟,以此序号作为文件名,检索时提供查询时间便可快速定位到目标数据所在的文件;满十分钟的缓冲区转储时,每个数据文件都有自己一份复制的数据索引结构,可以单独提供索引查询。
本发明的优点和积极效果:较之以往的设计只用一个内存缓冲区的方式,本发明采用两个内存缓冲区的方式,交替用来收集,收集满了就转储为磁盘文件,这样可以确保收集过程中,数据不会丢失,且存储过程可以以低优先级进行,尽最大程度满足了历史数据收集的时限性。再者,根据本发明的索引结构,做到了历史数据的收集完全是基于时间,这样在查询时也只需根据时间即可定位到目标数据,大大降低了系统的复杂性;本设计的索引结构一般只有几百K 到几M,这占用非常小的系统内存,同时通过索引结构来代替历史数据的时间戳的方法,可以大大降低存储空间的需求。以往的设计是所有的磁盘历史数据索引共用一个大的索引结构,本发明改为每个文件自带一个小的索引结构,这样可以保证在工程变更,索引结构变化后,以前的文件还能够独立查询而不受影响。本发明提供的方法能够保证历史数据的收集的实时性,方便历史数据的管理和查询,提高系统性能。
附图说明
图1本发明提供的历史数据收集及存储的方法收集表图;
图2本发明提供的收集类型表结构图;
图3本发明提供的收集组表图;
图4本发明提供的数据在内存缓冲区的存放结构图;
图5本发明提供的磁盘文件整体结构图;
图6本发明提供的索引区与数据区的存放次序图;
图7本发明提供的实施例逻辑执行图。
具体实施方式
为能进一步了解本发明的发明内容、特点及功效,兹例举以下实施例,并配合附图详细说明如下。
本发明涉及一种用于从实时数据库中获取历史数据并高效管理的文件格式存放数据的方法。主要包括:1、将一天中24小时从0点0分0秒严格分成144 个整十分钟,每个磁盘数据文件从0-143依次命名,每个内存缓冲区的起始时刻也是从整十分钟开始,对所有收集变量的十分钟采集数据开辟两个同等大小的内存缓冲区(分别记为#0和#1区);2、两个内存缓冲区用于交替存放收集到的历史数据并提供十分钟之内的历史数据查询,它们每十分钟交换一次。即#0 号区收集满十分钟后转储为磁盘文件,#1号区开始收集;3、当一个内存缓冲区满时,将其转储为一个独立数据文件,历史库文件每天一个目录,目录名为XXXX 年YY月DD日,文件名用每个10分钟文件的起始时刻在24小时中所处的第几个十分钟来表示(0~143),并以此作为查询数据时的快速索引;4、每个磁盘文件都有自己独立的索引信息,它由四部分组组成,即文件头,点名点号,索引区,数据区。这种方法能够保证历史数据的收集的实时性,方便历史数据的管理和查询,提高系统性能。
下面结合附图对本发明的结构作详细的描述。
索引区内容为:最开始存放收集表,包括收集类型数,当前存盘区号,收集类型表地址,图1所示;紧接着存放各种收集(周期)类型对应的收集类型表,包括本类型的收集周期,本类型的收集组数,本类型每个点十分钟要收集的点值个数,本收集类型的收集组地址,本类型本周期收集组号,图2所示;然后存放着各个收集组,包括组内最大点数,初始点数,当前点数,组内收集点号表区指针,组内第一个历史值在收集数据区中的位置,组内第一个点的当前收集位置,内存文件的当前收集区号,图3所示;
具体运行步骤为:
步骤1,系统启动时,开启历史服务进程。历史服务进程会首先根据索引表文件长度开辟一块内存区,然后将组态生成的索引表文件加载到该内存区;初始时不能确定从哪区开始收集,故将区号置为-1;
步骤2、根据索引表读出收集变量的周期类型数,找到各周期类型的收集类型表,并初始化它:将组号置为0,表示第一组;根据本类型的周期,计算出本类型每个点十分钟要收集的点值个数,计算方式为:600/周期(600表示10分钟等于600秒);获取本周期类型的收集组的偏移计算其内存地址;
步骤3、根据收集类型表的组数及组的位置,依次读出各个组的结构类型,并初始化它:本组点号区转为相对索引表初始位置的偏移;本组点值数据区偏移计算方式为:本组最大点数*十分钟点值个数*每个点值大小,此后为累计偏移;组内第一点当前收集位置置为-1表示初始收集;内存文件当前收集区号置为0表示从#0区开始收集;
步骤4、根据步骤3计算出的所有点值数据区大小,创建两个相应的同样大小的内存区,用来临时存储十分钟内收集到的点值;
步骤5、启动点值的收集线程,负责各个点值的收集。用一个定时器回调函数来控制收集,它每秒钟触发一次收集信号。同时开启存储线程,进入等待存储信号的触发的状态;点值的收集过程为:定义一个计数变量m_count,它以最大收集周期为计数周期循环计数,当满足 m_count%周期=0就触发对应周期类型的收集,这保证本区十分钟内,各种周期的点值都能同步收集到。当一个周期类型可以收集时,就收集其各个组的各个点的当前点值,开始从实时库读多个点项的值,并写入内存区的相应位置,位置根据步骤2和3来确定。
步骤6、如果当前收集时间大于或者等于该收集区的结束时间,则进入了下一个缓冲区进行收集,设置新收集区的开始和结束时间,计数器清0,并启动存档线程。
步骤7、当启动存档线程时,根据本区的整十分钟的起始时刻生成文件号,即根据收集的起始时间生成文件名。然后在当天目录下生成该文件。文件的结构为:文件头,点名点号区,索引区,数据区,如图5所示。文件头包括:点名点号区偏移及其长度,索引区相对文件头偏移及其长度,点值数据区相对文件头偏移及其长度;紧接写入文件头结构体,点名点号区,步骤1的索引区,最后是步骤4和6生成的数据区。最后根据写入的内容计算并填充文件头的各部分值。
以上所述仅是对本发明的较佳实施例而已,并非对本发明作任何形式上的限制,凡是依据本发明的技术实质对以上实施例所做的任何简单修改,等同变化与修饰,均属于本发明技术方案的范围内。