使用bit作为最小存储单位可以提高存储效率

计算机在读、写存储的时候最小单位是Byte,通常情况下这已经可以满足一般要求了。

但是在对存储效率要求极高的场合下,有必要使用bit作为最小存储单位。

以股票行情数据的存储为例看用bit存储的优势。

需求是记录每个时间点股票的价格,由于股票数量多,时间片间隔小,因此每天都会产生上百万条数据。这种情况下就有必要使用bit存储数据了。

每条数据有4个字段:时(1Byte)、分(1Byte)、价格(4Byte,单精度浮点数或者以分为单位的整形)。

正常情况下,应该是:6个Byte,价格如果用Decimal型或者字符型存储的话,需要的存储空间更大。

但是如果使用bit类型精细分解存储的话,效率就高多了:

时的取值范围是9-15,而2^4=16,因此只需要4bit就足够了;

分钟的取值范围是0-59,而2^6=64,因此只需要6bit就足够了;

股价麻烦一些,首先将价格单位为分使小数变成整数,历史上的最高价股是贵州茅台(2627.88元),价格0取值范围是0-262788。而2^19=524288,因此19bit既能满足当下需求,也能考虑未来的股价发展。

汇总起来,每条记录需要的存储空间是4+6+19=29(bit),也就是4Byte,4*8-29=3(bit),剩下3bit补0。

1.jpg

4Byte对比原来的6Byte,单位存储的存储效率就提高了50%,相同数据量的硬件成本下降33%,还是相当可观的。

这里的例子只有3个字段,因此性能的提升并不算大,如果是现在非常火的物联网场景中,大量的传感器的工作状态需要存储,它的运行状态只是0、1而已,用bit已经足以满足要求,用Byte的话(1Byte=8bit),就浪费了7个bit,存储效率只有12.5%。

字段越少单位存储效率的提升越不明显,假如只有1个字段,那用bit和用Byte是完全一样的,用bit节省的空间最后也会通过补位浪费掉;字段越多,单位存储效率的提升越明显,假如刚刚好8的整数倍个bool值需要存储,那么存储效率刚好是原来的8倍。

不止在自己存储的时候可以提升存储效率,在使用数据库存储的时候也有同样的问题。以MySQL为例有一种专门的bit类型用于保存bit数据(如果你使用phpmyadmin建表的时候没找到这种bit类型,请升级你的phpmyadmin),SQLServer中也有类似的bit这种类型数据。

最后总结一下

用bit存储的优点:

1存储效率极高


用bit存储的缺点:

1 开发成本高

2 当字段少、数据量少的时候体现不出优势

3 写入效率略有下降(用Byte存储的时候,写入数据可以直接写入覆盖;用bit存储的时候,写入数据之前需要先读取1个Byte,位运算之后再写回)

4 生成的二进制数据不可读

扫码关注我的公众号