2017-07-17 49 views
0

我正在實現事件源代碼體系結構,並且我的聚合將在內存中包含大量記錄。爲了測試在內存中記錄的.NET存儲有多好大量的,我創建了一個簡單的程序:事件源頭:在內存中存儲大量記錄的開銷

static void Main(string[] args) 
    { 
     Dictionary<string, object> dict = new Dictionary<string, object>(); 

     int maxRecords = 100000000; 

     for (int i = 0; i < maxRecords; i++) 
     { 
      dict.Add(i.ToString(), new String('A', 10)); 
     } 

     Console.WriteLine("Done"); 

     Console.ReadLine(); 
    } 

在config文件中,我有:

<runtime> 
    <gcAllowVeryLargeObjects enabled="true" /> 
    </runtime> 

所以我存儲1億條記錄和每個記錄是10個字節(假設20個,因爲它可能是Unicode)。所以我將大約2GB的數據存儲在內存中。然而,應用程序增長到15GB。

  1. 理想情況下,我想存儲在IDictionary中的東西。有什麼我可以做的,以減少開銷?

  2. 如果有人從事一個在內存中存儲大量數據的事件採購架構,請分享您的經驗以及您如何構建您的聚合。

+0

爲什麼要將聚集存儲在內存中? –

+0

如果我將Aggregates存儲在數據庫中,那麼我是否會因爲不需要執行CRUD操作和對象關係映射而喪失事件採購的一些好處? – Sandy

+0

你不會丟失任何東西,並且你獲得了可擴展性。 –

回答

0

對於這個問題古典的解決方案通常代表在兩點:

  • 選擇正確的聚集根,所以狀態,這其中的將是小的。由於不允許集合間通信,因此爲了執行單一命令,應該只爲一個聚合根加載一個小的狀態。它可以輕鬆地通過來自數據庫的異步查詢來檢索

  • 將查詢方存儲在許多不同的集合上,其上的每個項目都被文檔標識符隔離。所以你的系統進程不必在內存中持久化讀取模型。

+0

您能否詳細說明一下?當你說「在許多不同的集合上存儲查詢方」時,你的意思是在數據庫中嗎? – Sandy

+1

@Sandy在一般情況下,應該在更高抽象層中表示存儲,並且與數據庫無關。因爲任何讀取模型實體都可以在有序列表中拆分,比如集合列表,所以讀取模型時最好使用它。 在SQL服務器集合中是表,文檔是具有唯一GUID的錶行,與其他行和表沒有關係。在mongodb它是一些Guid'd文件的自然收集 (如果你喜歡答案,請投票:) –