热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

oracle历史数据存储,一种历史数据收集及存储的方法与流程

本发明属于自动化控制技术领域,尤其涉及一种用于从实时数据库中获取历史数据并高效管理的文件格式存放数据的方法。背景技术:现代自动化控制系统规模越来越大&#

428bd39d97261a355d170db6bd00b339.gif

本发明属于自动化控制技术领域,尤其涉及一种用于从实时数据库中获取历史数据并高效管理的文件格式存放数据的方法。

背景技术:

现代自动化控制系统规模越来越大,处理能力越来越强。其支持的点数数也越来越多。由此产生的数据量就更加庞大。历史数据库负责数据的收集,将需要的数据保存到磁盘上,并提供查询。

目前,自动化控制系统的历史数据库大多采用成熟的商用数据库,如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生成的数据区。最后根据写入的内容计算并填充文件头的各部分值。

以上所述仅是对本发明的较佳实施例而已,并非对本发明作任何形式上的限制,凡是依据本发明的技术实质对以上实施例所做的任何简单修改,等同变化与修饰,均属于本发明技术方案的范围内。



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
author-avatar
我只爱庄宝贝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有