前言
项目中使用MongoDB存储文本数据,通过pymongo连接DB提供python查询接口。原始文件每天增长,项目需要评估MongoDB服务器使用什么规格的硬盘,那么当文本文件存入MongoDB后,相比原始文件,MongoDB磁盘占用多少,压缩率如何,怎么可以优化磁盘占用空间。本文尝试解答这些问题。
测试步骤
测试文件:
csv文件,13,515,366行,22列 文件大小: 4.6G
(csv文件使用mongodb是因为不同的csv文件中列是不同的)
测试方法:
测试三种情况下,MongoDB中collection大小情况。
- 使用mongoimport将数据导入MongoDB
- 在第一情况下,enable mongoimport的ignoreBlanks参数
- 将csv文件的header都改为比较小的,如c1,c2,...,c22。
在mongo shell中查看collection的状态信息。
db.your_collection.stats(scale=1024*1024)
{
"ns" : "kmjones.lahaina.NV.REV003_MSIP_Volume_CT_AZ5FV_17.csv",
"size" : 9078,
"count" : 13515366,
"avgObjSize" : 719,
"storageSize" : 980,
........
}
size:collection 大小 avgObjSize:每一行数据的大小 storageSize:collection占用的磁盘空间
测试结果:
![ef17f305dd99991b025718abcc36a579.png](https://img-blog.csdnimg.cn/img_convert/ef17f305dd99991b025718abcc36a579.png)
相比原始csv,MongoDB中会增加一列,ObjectID 大小为:13515367 * 12 /1024/1024 = 154.67 MB
除去ObjectID大小,MongoDB有 4.6G / (980 - 155)MB = 5.6x的压缩比例。
当忽略csv中空数据后,磁盘空间更小。csv的header因为在json数据时需要重复,所以小header可以减少磁盘占用。
总结:
- MongoDB默认存储引擎是WiredTiger,snappy压缩。本测试中相较原始文件,有~5x压缩率,供硬件设施规划参考。
- 导入文件时候忽略空的列,能够减少磁盘占用空间,但不能区分没有此列和此列为空的情形。如果此信息不重要,可以打开ingore blank以节省空间。
- csv文件的header会占用空间,因为转为JSON文件时,header会存在每个document中,所以尽量让header更小。