2017-05-08 110 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