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系统不能正常归档,应该就是由于此缓存机制导致的(连续读操作造成写缓存失效)。

Android之数据存储

本课程介绍了Android中几种数据存储方式,让大家对Android中的数据存储一个系统的认识
  • 2016年09月22日 22:27

OSI PI实时数据库系统

OSI PI实时数据库系统PI 实时数据库系统 (Plant Inhrmation System) 是由美国 OSI Software 公司开发的基于 C/S、B/S 结构的商品化软件应用平台,是工厂...
  • baiyang0475
  • baiyang0475
  • 2009-08-23 09:03:00
  • 1917

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

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

【实时数据库PI-SDK】关于PITime的悲剧

不知道为什么,在PISDK的文档中如果仅看目录发现不了PITime,只有通过索引进行查找方能找到。而如果想通过PISDK插入实时数据的话,必须要同时插入当前时间。如何获取当前时间着实是一个问题,想规范...
  • mmnn606
  • mmnn606
  • 2012-08-12 21:20:27
  • 1191

实时数据库简介

实时数据库简介 1.前言  一提到数据库,大家肯定会想到SQL Server、Oracle等关系型数据库。实际上,数据库的种类非常多,在计算机发展的历史上,存在着多种类型的数据库。 早期,关...
  • liqfyiyi
  • liqfyiyi
  • 2011-10-11 15:11:18
  • 28348

c# 读PI实时数据库的tag

  • 2010年06月13日 14:53
  • 375KB
  • 下载

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

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

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

    实时/历史数据库PI的大名想必很多人都听过,在国内很多电厂的SIS系统都是用PI做的。PI在实时/历史数据库领域是做的最为成功的,但同时价格也是最高的,动辄几十万甚至上百万的价格让很多中小企业...
  • jackjoy
  • jackjoy
  • 2007-10-15 17:10:00
  • 3810

PI.实时数据库系统---详细介绍

PI 实时数据库系统(Plant Information System)是由美国 OSI Software 公司开发的基于C/S、B/S结构的商品化软件应用平台,是工厂底层控制网络与上层管理信息系统连...
  • mmnn606
  • mmnn606
  • 2012-08-12 21:14:50
  • 3581

PI实时数据库

PI实时数据库   美国有限公司(以下简称“OSIsoft”)创建于1980 年,公司创始人为J.Patrick Kennedy 博士和Richard A.Sara 先生。总部设在加州San Lean...
  • huaqinli001
  • huaqinli001
  • 2010-03-30 14:24:00
  • 1018
收藏助手
不良信息举报
您举报文章:OSISoft实时/历史数据库PI的数据存储机制分析
举报原因:
原因补充:

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