事件采购:在内存中存储大量记录的开销

时间:2017-07-17 20:05:42

标签: c# memory memory-management heap-memory event-sourcing

我正在实施事件采购架构,我的聚合将在内存中包含大量记录。为了测试.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();
    }

在配置文件中,我有:

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

所以我存储了1亿条记录,每条记录是10个字节(因为它可能是Unicode,所以说20条记录)。所以我在内存中存储了大约2GB的数据。然而,应用程序增长到15GB。

  1. 理想情况下,我希望将内容存储在IDictionary中。有什么办法可以减少开销吗?

  2. 如果有人参与了在内存中存储大量数据的事件采购架构,请分享您的经验以及如何构建聚合。

1 个答案:

答案 0 :(得分:0)

这个问题的经典解决方案通常有两点:

  • 选择正确的聚合根,因此其中哪些状态将很小。由于不允许聚合间通信,因此对于执行单一命令,您应该只为一个聚合根加载一个小状态。它可以通过数据库中的一个异步查询轻松检索

  • 将查询侧存储在许多不同的集合中,其上的每个项目都按文档标识符隔离。因此,您的系统进程不必在内存中保留读取模型。