2016-07-31 153 views
4

在應用程序中,我使用buckets的概念來存儲對象。所有的桶在創建時都是空的。其中一些可能會在兩個小時內填滿20個物體的最大容量,一些在6個月內。每個對象的大小几乎是固定的,即我不認爲它們的大小差異超過10%,即滿桶的大小也不會。實現看起來與此類似。保持padding factorMongoDB的實體預填充以避免使用彈簧填充

@Document 
public class MyBucket { 
    // maximum capacity of 20 
    private List<MyObject> objects; 
} 

一種方法是將預填充我的桶的虛擬數據。兩個選項來我的腦海:

  1. 創建虛擬數據桶,保存它,然後重置其內容,並再次
  2. 保存創建虛擬數據和其標記爲「原始」的水桶。在第一次寫入時,該標誌被設置爲false,並且數據被重置。

缺點很明顯,選項1需要兩次數據庫寫入,選項2需要額外的(非業務)代碼在我的實體中。

也許我不會用任何解決方案便宜地下車。儘管如此,任何有關該問題的實際經驗,任何最佳實踐或提示?

設置:春季數據的MongoDB 1.9.2,MongoDB的3.2

+0

你能否更詳細地解釋一下問題究竟是什麼,你用填充因子解決什麼問題? –

+0

我想避免的情況如下: 我在幾天內創建了100.000個初步空桶。我知道80%的水桶在一年的時間裏會增長到其尺寸的20倍。如果我沒有預先填充這些桶,他們將會很快產生4的填充因子,導致內存使用效率非常低,大量搬遷和浪費空間。我知道有一些選項比如壓縮或修復,但我會盡量避免告訴MongoDB它可以預期的文檔大小。 – Matt

回答

2

據瞭解您主要關注的是有關文件的大小導致對文檔的搬遷和索引更新增加性能開銷。這是mmapv1存儲引擎的實際情況,但是自從MongoDB 3.0版本以來,可用的WiredTiger存儲引擎不存在此類問題(請檢查類似的question)。