linkman

学习记录,兴趣方面:工控软件、C++编程、人机界面、嵌入式软件、可视化等

导航

实时数据库中的二级压缩技术

今天心情不好,写写文章散散心。

我在文章《实时数据库领域中有关数据压缩的认识误区》中提到,在工业应用领域中,常用的压缩算法分为三类:无损压缩、有损压缩、二级压缩。二级压缩技术,同时利用了无损压缩、有损压缩这两种数据压缩技术。

liyaoer123同学很好学也很好问,他问到:“我有点疑问,通过旋转门压缩后的数据基本上是没有重复量了,二次压缩这个词应该不能准确表达意思。”

首先要提醒liyaoer123同学一下,旋转门压缩只是有损压缩的一种,osisoft公司似乎还拥有旋转门压缩的技术专利,我们还是少提它吧。

常用的几种的有损压缩的方法都类似,主要是抽取那些特征点,以特征点的连线来近似地表示原始数据曲线,如下两图所示。

图一 压缩前,总共有52个采集点

图二 压缩后,只有6个特征点

二级压缩的概念,是在已进行有损压缩的基础上,再次对数据进行压缩。

对于二级压缩,需要考虑如下如下两方面的问题:

1、为什么需要进行二级压缩?

在《实时数据库领域中有关数据压缩的认识误区》中,我已提到,对实时数据库而言,数据压缩可以带来两方面的好处:占用硬盘容量减小、系统整体处理速度提高。

随着计算机硬件水平的提高,硬件成本在整个系统投入的比重逐步下降,硬盘容量不再是实时数据库中最主要的矛盾,但对系统整体处理速度及性能的追求,还是非常重要的。

关于压缩性能和系统整体处理速度及性能的指标,我经常面对两类指责。

有一些人对我说,我们保必要追求那么高的压缩比,何必要追求那么快的处理速度,只要够用就行了,我们还是将精力放在系统的稳定性和可靠性方面吧,似乎对指标的追求导致了系统稳定性的下降。

而另外一些人则对我说,你们中国人只知道在低层次上的技术水平上竞争,现在PI的最新的版本已支持单服务器1000万点,而国内这些实时数据库厂家还在10万点这个层次上竞争。

对这两类指责,我不想评价是与非,只想说,不管我们做什么,都会有不同的意见,关键的问题是,我们自己想做出什么东西。

对于MES系统集成商,实时数据库只是其中一个子系统,只要够用就行,而作为实时数据库的提供商,我们希望我们的实时数据库系统在各个指标方面,包括稳定性和可靠性方面,也包括功能的完备性和需求的准确性,都能全面与国外产品抗衡,因此,对性能的追求是一直会坚持走下去的。

写到这里,跑一下题。这前段时间在全国几处地方跑了跑,与很多客户进行了技术和商务交流,当我们提到,我们的实时数据库的数据读写指标为每秒30万次,他们大部分表示了惊讶:不对呀,PI和IH都是每秒2万到10万呀,你们的实时数据库怎么比那些国外的品牌还要强呀。

再将马拉回来,我在《此实时数据库非彼实时数据库》中提到,压缩比例的提高,对实时数据库的整体性能的提高有很大的推动作用(但不一定成正比),因此,有必要分析一下,能否对已经进行有损压缩处理的数据进行二级压缩。

2、如何进行二级压缩?

从刚才分析的情况,大家很可能就得出结论,行呀,先通过有损压缩,将点数由52个变成6个,再对剩下的6个点进行编码,再进行哈佛曼压缩或别的什么压缩,不就行了?

没这么简单。

哈佛曼压缩的特点是,将那些经常使用的字母用较小长度的字节表示,这在文本和字符串压缩中会有比较大的效果,比如英文那个e就是用得很多的,而汉字中的五笔字型也有一级编码、二级编码等,也就是说,它们具有可压缩的余地。

如果大家对随机的数据点,比如刚才6个数据点,采用哈佛曼或其它无损压缩试验,会发现压缩率不会特别地高,也就是说,再次进行无损压缩的意义已经不是特别地大。

难度就没有别的办法了?办法还是有的,要完整地表达测点的一个数据,需要包括以下四个字段:

  • 测点ID

  • 时间戳
  • 质量戳

其中,同一测点的多个数据可以保存在一起,因此,测点ID可以不考虑。还剩下三个字段,仔细分析一下这三个字段的特性,还是有很多文章可做的。

先考虑“值”字段,我们采用8字节的双精度数来表示一个模拟量,这里就存在一个由低精度值来表示高精度值的可能。如果一批数据中,全部(或大部分)数据都可以由4个字节(或2个字节)来表示精度误差范围内的8字节双精度数,便可以节省下很多空间了。

当然,如果我们能明确地知道某数据的精度范围,便可直接在配置环境下选择最合适的数据类型,而不必要一定要选择双精度数。

对于值,还有另一种压缩思路,在流程工业中,某值的绝对值可能非常大,但如果该值在某时间段时的变量范围在某个精度范围内,也可以采用基准值+变化值的方式保存值,其中基准值只保存一次,而变化值用低精度值表示。

质量戳

质量戳是慢变化量,如果不与值共同保存,则可以有很高的压缩比。但如果不共同保存,则需要考虑查找的索引方式,这是一笔额外的空间开销。

时间戳

对于时间戳,也可以按照值相类似的方式来考虑。

首先,那个毫秒字段,不一定是每个系统每个测点都需要的。再者,两个时间之间的相差值,在大部分情况下,不会超过1天的,这个就可以采用简化表示。还有,现在的系统,肯定不需要再处理时间为2000年以前的时间了。

以上只是分析,在实际系统中,还需要考虑这些因素的制约关系,解压的难度和时间度,索引建立的方便性,以及编程的复杂度。

posted on 2007-11-17 13:10  linkman  阅读(1077)  评论(0编辑  收藏  举报