2017-05-08 113 views
1

我有一个设备,它从不同的侧面积累温度并每秒钟将它们保存到数据库中。对于每一个测量我的下一份文件:MongoDB使用巨大的阵列减小文档的大小

{ 
    "_id" : ISODate("2017-05-05T22:07:37.924Z"), 
    "north_side" : [ 2660 elements * Int32 ], 
    "east_side" : [ 1330 elements * Int32 ], 
    "south_side" : [ 2660 elements * Int32 ], 
    "west_side" : [ 1330 elements * Int32 ] 
} 

这里_id是一个时间戳,测量完成时。并为每一方完成温度阵列。完全装置每秒测量7980个温度(以uint16_t格式)。但是,将所有这些测量结果存储一个月将占用太多空间。

我从db.getCollection('temperatures').stats()得到一个统计数据,它显示avgObjSize = 75445字节。它每月大约6.5 GB。

存储7980温度与32位(我是否被迫使用32位,因为mongodb没有16位值?)将需要31920字节。对于还有哪些mongodb使用43525个字节的数据,以及如何减少这个值?

回答

2

我假设温度在小数点后面有数字,所以它们不是整数。无论如何,mongo“默认情况下将所有数字视为64位浮点双精度值。”

所以这是每个数字8个字节,而不是4更接近你指的是平均的对象大小,其余的,我想,是控制值,数组大小等

你可以降低通过进行合理的简化(例如每边只存储一个双精度值),然后仅以十分之一或百分之一(1/10,1/100)存储差异,并将整个集合存储为仅一个字符串。像

99|101|67|-13|-23|9|17 ... 

更新:甚至更好,如果你的语言支持编组,然后在内存中创建强类型的阵列和存储编组对象。仅仅将差异存储为双数的整数仍然有帮助。

+0

感谢您的建议,我会尝试其中的一些。温度存储为Int32值,而不是Double。 – Serbin