为了节省数据的存储空间,可对数据编码长度进行压缩。数据压缩后,再行存储,即压缩存储。读取压缩存储的数据要解压缩,才能清楚它的含义。一般讲,这是上位计算机要做的事。只要清楚数据是怎么压缩的,解压缩是不难的。
压缩存储不仅节省存储空间,而且也节省数传输的开销。
数据压缩分为两种:
一种和语义无关,压缩时只从数据的形式出发,不涉及数据信息内容,这种技术适用于任何数据。
另一种与语义相关,压缩时考虑数据信息内容和语义,去掉其中一些冗余的信息。计算机常用的压缩技术有模式替代、压缩重复字符、免写空字域、编码替代、不等长编码、相邻数据利用、消除冗余信息等。
1.基本数据压缩技术
(1)用十六进制码取代BCD码。BCD码中每一位都用4位二进制数存放,表达的数字仅是0~9,10个数码。其实4位二进制数可表达16个数码。所以用BCD码存数存在资源浪费。一个字(16位二进制数),用以表达(或存)BCD码数,最大只能到9999。而用以表达(或存)16位二进制数,最大可达65535。如果预先将它转换成二进制就能节省很多存储空间,而且还便于算术运算。
(2)合并数据代替单独数据。日期数据,有年、月、日,要用两个字(4个字节)表示。如2004年6月30日,则写成2004(一个字),06(一个字节),30(一个字节)。当然,如千年不考虑,用3个字节也可,如上例,用04,06,30也可表示。如把这数据合并,合并后再存储,就不要3个字节了。
合并数据的方法是,各合并数先加权,后相加。如本例月的先乘40(一个月最多31天,为了好算),年先乘400(年最多366天、考虑闰年,为了好算),日不乘。这样,2004,06,30的日期,合成的值将是1690。如果计算到2099年12月31日,则此值为44431。用十六进制格式存储这个数,两个字节就够了。存储长度压缩了1/3。
数据还原也不难,如1690,先被400整除,得4,即2004年。再把它的余数,270,被40整除,得6,即6月。而后者的余数,30,即30日。(www.daowen.com)
处理时、分、秒,也可用类似方法。但为了充分利用内存,最好把年(只考虑80年)、日、时,分在一组,用一个字存,而月、分、秒分在一组,也用一个字存。两个字,即可把本应用3个字才能存的年、月、日、时、分、秒进行存储。
(3)存相对值而不存绝对值。对数值数据可以采取求差法,例如电量,存增量,一个字节就够了。需得知月累计值,可在读出数据后计算。
但,这么做,数据不太安全。万一有一次存储数据丢失,累计值就不对了。故一般不用。
(4)以位计算存储单位。每个记录不以字或字节为单位,而二进制位(bit)为单位,计算存储长度。这可充分利用剩余的二进制位,提高存储效率。只是算法复杂些。
2.高级数据压缩技术
原则上说,数据压缩技术与数据的语义有关。合理的压缩是去掉数据中的无关信息,而保存有关信息。数据的形式虽有变化,但它所保存的有关语义信息没有变化。具体的方法很多。在此不多介绍了。
3.问题
数据压缩也带来一些问题。数据压缩会增加程序系统的复杂性;被压缩后的数据可能会失掉原有良好的标准形式,降低它的通用性、可移植性及可靠性。因此是否采用压缩技术需要根据具体问题来决定。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。