C#中使用ProtoBuf优化百万级数据的存取性能
ProtoBuf简介
ProtoBuf是Google定义的一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。
使用场景
近期一个实验室上位机系统要求对实验数据的存取进行性能优化,由于大实验(长实验)的数据量很大基本百万级至千万,而数据展现又要求整体加载,因此原有设计性能很低一般500万数据要近百秒才能加载完毕,客户体验非常差,因此用C#通过ProtoBuf做了一个测试程序现分享给大家。
测试案例
先以20个浮点类型字段、1百万数据为例做测试,过程如下:
1、使用二进制序列化
运行界面
2、使用ProtoBuf序列化
运行界面
3、使用二进制序列化并压缩存储
运行界面
4、使用ProtoBuf序列化并进行压缩存储
运行界面
5、各中方式存储的文件大小如下图
100万数据存取性能对比
测试方式 | 数据初始化(秒) | 数据保存(秒) | 数据加载(秒) | 数据显示(秒) | 数据加载并显示(秒) | 文件大小(KB) |
---|---|---|---|---|---|---|
二进制 | 0.3044051 | 7.1640818 | 66.1807227 | 1.5011486 | 66.464526 | 173829 |
ProtoBuf | 0.3035614 | 1.650829 | 1.5131249 | 1.5191064 | 2.2606908 | 188461 |
二进制压缩 | 0.2829953 | 13.0281727 | 66.4448872 | 1.5402633 | 67.0152388 | 6531 |
ProtoBuf压缩 | 0.3318087 | 5.1230357 | 2.7574059 | 1.508245 | 3.4230047 | 2576 |
总结
对于500万数据的情况下二进制序列化基本不可用,而ProtoBuf基本在15~20秒之间完成加载并显示。通过这个测试得出如果在追求性能极致额情况下直接使用ProtoBuf序列化和反序列化,如果数据要长时间保存考虑磁盘空间有效利用的话可以采用ProtoBuf压缩方式,性能稍有损失,但是文件压缩率很高可以很好的提高磁盘空间利用。