OSISoft实时/历史数据库PI的数据存储机制分析

原创 2007年10月15日 17:10:00
    实时/历史数据库PI的大名想必很多人都听过,在国内很多电厂的SIS系统都是用PI做的。PI在实时/历史数据库领域是做的最为成功的,但同时价格也是最高的,动辄几十万甚至上百万的价格让很多中小企业是望而却步,但听说最近OSISoft公司又提高了PI的价格,真是牛啊!
    前一段时间因为工作需要,对PI的历史数据存储机制做了一些分析之后,大体弄明白了PI是如何存储历史数据的,一些以前无法想明白的问题也找到了答案。例如,在PI的很多文档上都提到了,存储一条32位浮点型的变量的记录平均只需5个字节,以前就很难想明白PI是怎么做到的。因为一条记录至少需要包含三个字段VQT(V:Value,指变量值;Q:Quality,指数据质量;T:Timestamp,指变量值对应的时间戳),对于32位浮点型变量而言,变量值V就需要4个字节存储,这就意味着Q和T平均只占用一个字节,这几乎不可能,但是PI做到了,接下来我们就来具体看看PI是如何做到这点的。
   需要声明的是,我所做的分析是根据PI的windows版本(V3.4)所做的,所以分析结论并不完全适用于其他操作系统平台下的PI版本(例如在Unix系统下的缓存实现机制),如果哪位朋友有这方面的心得体会,也希望能拿出来跟大家分享一下,我也乐意就本文内容以及任何与实时/历史数据库相关的问题与大家进行交流。
    首先简单介绍一下PI的历史数据文件的基本格式,PI的历史数据都存储在形如piarch.001这样的数据文件中,与之相对应的还有一个形如piarch.001.ann这样的文件,后者是用来存储针对变量记录的注释用的,一般很少使用,我也未做分析。对于形如piarch.001这样的数据文件内部,PI采用的是分块(分页)的管理方式,每块(页)的大小为1024字节,这实质上隐含限制了一条变量记录的长度是不可能超过1000字节的。页从文件开头开始编号,第一个页号为0,用于存储跟文件相关的信息。之后的页就用于存储变量历史数据,每个变量初始被分配一个页用于存储数据,随着记录的追加,更多的页被分配给变量,当页数多余3时(根据我的观察)时,PI采用如下的数据结构来组织变量数据(图1)。


   
                            图1 PI的历史数据存储结构

    从图1可以看到,PI采用的是一种两层的简单存储结构,而不是大家通常想象的多层树型结构(例如B+树)。每一层相邻的两个页之间是互相链接在一起的,同时叶子节点(记录节点)也维护到父节点(索引节点)的反向引用指针。在索引节点上存储的记录是每个记录节点的起始时间和对应的页号。这样的存储结构有什么优点、有什么缺点,相信大家都是一目了然,我就不多说了。
    接下来说说每个页(块)内的数据组织,前面已经说过每个页的大小为1024字节,除去30字节左右的固定页头(不同数据类型的页头会有细微差别,但都包含以下信息:变量ID、当前页号、上一页号、下一页号、父页号、是否为索引节点标志、记录条数、起始时间戳等),每个页用于存储历史数据的有效空间为990个字节左右。
    对于历史记录的存储,PI最核心的理念就是“不顾一切的尽可能缩减存储记录所需要的磁盘空间”,为了达到这个目标,PI采用的是变长记录的存储方式(注意:没有关系数据库里面的所谓行偏移数组),而且还不惜牺牲时间精度。对于时间戳T的存储,PI采用的是差分法,即只存储与前一条记录的时间戳之差值,如果这个差值能够用一个字节表示(通常单位为秒,不过依据PI的文档,好像还可能是更大的单位),那么这个时间戳T就只需用一个字节表示;如果无法用一个字节表示,或者差值小于1秒,则使用多个字节表示(2~5?)。对于质量戳Q的存储,PI的策略是如果该质量戳是好的(GOOD),则不存;即只存坏质量戳,这通常意味着对于99.99%的数据记录而言,不需要存储质量戳。相信大家现在都已经明白了,前面的存储一条32位浮点变量记录平均只需5个字节是怎么做到的了。
    以下几个图是根据以上分析结论所做的测试结果:

                图2  索引节点的记录(时间戳:页号)

 
                图3 叶子节点的记录(时间戳:变量值)

      
              图4 时间精度小于1秒的情形

    说完了PI的历史数据存储结构之后,最后再来简单说说PI的缓存实现机制(Windows平台)。根据我的实验观察结果,  我的结论是windows 平台下的PI归档系统(Archive System)并没有自己实现的缓存机制,而是直接利用的操作系统的文件系统缓存。这样的好处当然是实现简单,而且操作系统的文件缓存系统是一个能够动态扩展或者缩减的系统,能自适应环境的变化。缺点当然也很明显,那就是无法对缓存的页面进行更精细的控制(如要求其始终停留在内存中或者强制刷新某页或者进行优先级控制),而且很容易受其他程序的干扰(例如文件拷贝)。我们在实际中遇到的一个例子是:连续不断的读取PI历史数据,最后导致PI系统不能正常归档,应该就是由于此缓存机制导致的(连续读操作造成写缓存失效)。

.net关于PI读取实时、极值、历史数据详细例子

  • 2013年05月03日 14:41
  • 186KB
  • 下载

实时数据库简介和比较---PI

实时数据库是数据库系统发展的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物,实时数据库系统的主要内容包括: 实时数据...
  • xiaoyiyz
  • xiaoyiyz
  • 2016年02月24日 00:08
  • 5656

实时/历史数据库和关系型数据库的区别

实时数据库 实时数据库是数据库系统发展的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物。实时数据库最起初是基于先进控制和优化...
  • swazer_z
  • swazer_z
  • 2016年01月14日 09:05
  • 2537

实时数据库简介和比较---PI

实时数据库是数据库系统发展的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物,实时数据库系统的主要内容包括: 实时数据...
  • xiaoyiyz
  • xiaoyiyz
  • 2016年02月24日 00:08
  • 5656

数据库完善--历史记录问题解决

之前设计的数据库最大的问题在于不能把过去某个时间的状态信息显示出来,只是记录了单个信息的操作记录。所以这样就会出现一些问题,例如,上个月一个班里面有32个人,前几天有一个人退学了,那么现在查询的这个班...
  • Jesse621
  • Jesse621
  • 2013年02月22日 21:16
  • 6749

工业大数据漫谈12:实时数据库与时序数据库

在工业大数据数据库存储领域,除了传统的关系型数据库和分布式数据库以外,还有一种类型的数据库是非常常用,而且是非常有必要的,就是实时数据库和时序数据库。 实时数据库诞生于美国,主要是因为现代工业制造流...
  • guanhui1997
  • guanhui1997
  • 2017年06月02日 08:14
  • 2356

实时数据库和关系数据库的区别、对比

数据库和关系数据库   数据库是指按照一定数据结构和模型来组织、 存储和管理数据的仓库。 采用 关系模型建立起来的数据库叫做关系数据库。 关系数据库是建立在集合代数基础 上, 应用数学方法来处理数据库...
  • Herman_He
  • Herman_He
  • 2015年12月08日 10:29
  • 3127

获取历史和实时股票数据接口

股票数据的获取目前有如下两种方法可以获取: http/javascript接口取数据 web-service接口 1.1Sina股票数据接口 以大秦铁路(股票代码:601006)为例,如果要获取它的...
  • u014595019
  • u014595019
  • 2015年08月12日 20:57
  • 5085

实现搜索的历史浏览记录,含数据库

MainActivity.java 作用:显示搜索框具体代码如下: package scut.carson_ho.search_layout; import android.support....
  • sanciyuan2044123845
  • sanciyuan2044123845
  • 2017年04月17日 08:51
  • 724

数据仓库数据模型之:极限存储--历史拉链表

摘要: 在数据仓库的数据模型设计过程中,经常会遇到文内所提到的这样的需求。而历史拉链表,既能满足对历史数据的需求,又能很大程度的节省存储资源。在数据仓库的数据模型设计过程中,经常会遇到这样的需求:1....
  • jethai
  • jethai
  • 2016年08月28日 14:03
  • 2275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSISoft实时/历史数据库PI的数据存储机制分析
举报原因:
原因补充:

(最多只允许输入30个字)