今天咱另换一个话题,谈谈在实时数据库领域中,有关数据压缩的一些认识误区。
我曾答应liyaoer123(实时数据库阵地的博主)同学,与他讨论一下数据压缩技术。另外,我经常收到一些朋友的来信,他们对实时数据库及数据压缩的认识有一些误区,今天,我便收到三封讨论实时数据库的邮件。
数据压缩是实时数据库中一个很重要的概念和技术,只要接触过实时数据库,都应该听说过数据压缩。同时,很多人对实时数据库中数据压缩存在误解,我们就一条一条地解说吧。
1.实时数据库中的数据压缩技术很高深很神秘。
现在的数据压缩理论和技术已经很成熟,大家可以看看我转摘的博文《数据压缩技术简史》,该文章浅显易懂,是一篇很好的关于数据压缩的科普文章。
在不同的应用领域,又可以针对不同的数据应用特征,引用不同的数据压缩技术,比如,图形处理领域的JEPG压缩技术,声音处理中的MP3压缩技术等。在流程工业行业中,工业实时数据也有一定的变化规律,可以针对这些规律,研究特定的数据压缩算法。
下面是工业实时数据的一些特征:
- 工业实时数据的数据变化具有一定波形规律;
- 工业实时数据中只有一小部分测点的值经常发生改变;
- 工业实时数据中很多测点的数值都具有慢变化的特征;
- 数值变化与时间变化具有共同变化特性;
- 用户在一定范围内,能够允许数据的精度损失;
在工业应用领域中,常用的压缩算法分为三类:
- 无损压缩;
- 有损压缩;
- 二级压缩;
其中,无损压缩一般以通用压缩理论为基础,采取哈佛曼算法等经典的压缩算法;而有损压缩而更多地考虑了工业实时数据的特征,而采取的一些特殊舍点算法;二级压缩技术,则是同时利用了这两种数据压缩技术。
实时数据库的无损压缩以通用压缩理论为基础,随便找一本大学教材就能看懂,在此不再多说。
目前比较著名的有损压缩算法,有PI中使用的旋转门压缩算法,IH中使用的死区压缩算法,以及一些变通压缩算法(如在旋转门算法基础上改用二次均方差作为偏差比较,以提高数据还原精度),这些算法原理都比较简单。网上有很多相关的文章,我在前几篇文章中提到的变化压缩算法,是死区压缩算法的简化变种,而liyaoer123同学在他的博客上帖出了osisoft关于旋转门压缩的技术文章,大家有兴趣可以去看看。
总而言之,实时数据库的压缩算法真的不难理解,只是实时数据库重多技术中的一种而已。
2.只要搞清楚数据压缩算法,就能编写好的实时数据库了。
这个问题要从两方面来分析。
首先要说明,数据压缩只是实时数据库中一个技术点,这个技术点相对于实时数据库其它技术点而言,难度和工作量是非常小的,我在《实时数据库的理论与技术》中,列出了实时数据库需关心的技术点,大家可以看看。只搞清数据压缩算法,是不能编写良好的实时数据库的。
另一个方面,只从数据压缩这个角度来看,只考虑算法也是不行的。
在实时数据库的数据压缩模块中,除了要考虑压缩算法之外,还要考虑以下内容:
- 变量ID、时间戳、质量戳、值四个字段在压缩算法中的数据组织,包括逻辑组织和空间组织;
- 压缩算法与内存缓冲区的配合;
- 压缩算法与磁盘文件的配合;
- 特殊情况的数据处理,如,启动、停止、备份、恢复等时的数据压缩状态。
3.实时数据库中,数据压缩的压缩率越高越好。
刚才提到,实时数据库中的数据压缩算法都是非常简单,这是由实时数据库的应用特点决定的。
要考虑一个实时数据库的数据压缩技术技术,需要从以下几方面考虑:
- 数据压缩率;
- 压缩数据的检索和定位速度;
- 数据压缩时间;
- 数据解压时间;
- 压缩数据在内存和磁盘的组织结构,以便更方便地利用内存和磁盘的特性;
- 数据解压后的还原精度;
数据压缩率只是其中一个指标,实时数据库追求的是综合性能指标,不能只看某一项指标。
从某个角度而言,在实时数据库的应用中,数据的压缩和解压时间的指标,要优先于数据压缩率指标。但是,在设计良好的系统中,这两个指标之间并不矛盾。
4.无损压缩比有损压缩要好
在两个洋品牌PI和eDNA之间,经常会就无损压缩和有损压缩哪个更好这个问题产生争执。
基本上,在此争执中,eDNA的无损压缩处于攻势,而PI则见招折招处处守势。总的来说,eDNA的市场宣传做得很不错,很多用户都是这样评价:eDNA比PI相比有很多优点,它采用了无损压缩技术,还有......,而且,它的价格比PI便宜多了。
客观地讲,无损压缩有其好处,它在某些方面保证了数据的精度,但是,这并不能说,无损压缩一定比有损压缩好。
采用无损压缩算法的实时数据库厂家,不能回避以下两个问题:
采用无损压缩算法的压缩率比采用有损压缩算法要低得多,针对工业实时数据的特征信息提取的无损压缩,是不可能达到10:1的。
采用无损压缩算法的实时数据库,单机总处理点数会存在性能瓶颈,以目前主流的计算机而言,采用无损压缩算法的实时数据库,平均只能处理2万左右的历史点。
另外,无损压缩所宣称的100%保持数据不丢失,只是一句话宣传词,在计算机上处理工业实时数据,本身就存在大量的数据信息丢失:
- 数据采集传感器存在采集误差;
- 数据采集是实时数据趋势变化的采样和数字化的过程,采集周期之间的特征波型已经丢失;
- 计算机处理和网络传输造成的延时和不确定,也会造成采集波型的失真;
- 传感器和计算机的数据类型字节限制,也会造成数据的失真。
在存在多处无法控制的失真环节的情况下,只强调保存数据的完全不失真,是没有意义的,只是商务宣传的需要,只要是数字化和计算机化处理,所有的数据就是近似的处理过程。
有人会说,这也失真、那也失真,还处理个屁呀。这其实是一种处女情结,是在无意义地追求某个特定的指标而不考虑系统整体性能。如果实时数据库在采用无损压缩的同时,还能保证很快的解压缩速度和较高的压缩率,当然无可厚非,但目前的理论和技术条件下,这些指标是矛盾的。而采取有损压缩技术,是在不影响整体精度情况下的性能指标的综合平衡。
5.实时数据库中,数据压缩不重要,要不要数据压缩没关系。
关于这一论点,有两种不同的观点。
第一种观点认为,现在的计算机硬盘很便宜了,磁盘容量不够,大不了多买几块磁盘。
第二种观点认为,实时数据库的重点是上层功能和应用,在工业应用中,数据压缩费力又不讨好,还不如将精力放在其它功能上。
这两种观点都不正确,实时数据库的市场存在意义,是因为现在的其它数据库产品,不能地处理大量工业实时和历史数据。这里说不能处理,包括处理速度和磁盘容量。
在我的文章《实时数据库历史数据容量的计算方法》中计算得出,用关系数据库保存10000个每秒钟变化一次的双精度数,同时建立一个索引,保存一年需要磁盘空间为:12922G,而用实时数据库保存,则只需103G,大家可以换算一下,12922G,需要多少块磁盘?
磁盘容量只是问题的一个方面,另一方面,数据的高压缩率意味着整个系统的数据处理速度更快,这体现在三个方面:高压缩率的数据,占用磁盘空间小,将数据从磁盘读入内存的速度快,网络传输的速度快,数据在内存中占用的空间小。而这三个因素,是实时数据库提高系统整体运行速度很重要的几个因素。
一个良好的实时数据库,必须要处理好实时压缩问题,只有处理好数据压缩问题,才能使系统的整体性能达到某个可用性指标。
以下有一个对是否选用实时数据库和数据压缩技术的简单判断:
- 关系数据库只能处理5000点每秒变化的工业实时数据,在此范围内,可以不考虑选用实时数据库。
- 在5000点至10000点的系统内,需要抛开关系数据库,重新设计自己的数据存贮系统,但是,在这个领域,是不太需要考虑数据压缩技术的。
- 当系统的历史点数在10000点以上时,必须要考虑数据压缩技术和专门的实时数据库了。
很多朋友告诉我,他们的系统不采用数据压缩技术,他们也不关心数据压缩技术,他们认为,良好的上层应用软件比数据压缩更重要。我要对他们说:不同的行业,不同的系统规模,对实时数据库的性能指标要求是不一样的。实时数据库系统是一个综合性的应用系统,设计良好的底层模块是其它模块良好运行的基础,数据压缩技术与其它数据库技术一起,对整个系统的运行提供了很底层但很重要的环境,大型实时数据库系统中,数据压缩技术是必须考虑的,另一方面,实时数据库中,数据压缩技术只是实时数据库系统中一个重要的技术点,但不是全部。