代码之家  ›  专栏  ›  技术社区  ›  Denis

这是内存管理方面的最佳链吗?

  •  0
  • Denis  · 技术社区  · 11 年前

    我们有一个将C#poco对象加载到内存中的系统。(从磁盘上的数据源反序列化)。它们进一步缓存在ObjectCache(MemoryCache.Default)中,并通过Repository类公开。链条是这样的:

    private Dictionary<string, T> itemsDictionary;
        private Dictionary<string, T> ItemsDictionary
        {
            get
            {
                return itemsDictionary ?? (itemsDictionary = RepositoryLoader.Load());        
            }
        }
    
        private List<T> itemsList;
        private List<T> ItemsList
        {
            get
            {
                return itemsList ?? (itemsList = ItemsDictionary.Values.ToList());
            }
        }
    
        public List<T> All { get { return ItemsList; } }
    

    RepositoryLoader.Load()-将内存缓存中的项缓存为Dictionary ...

    我的问题是,正如您可以看到它也通过两个缓存的财产进行的那样,它是否会在内存消耗上产生重复有没有办法优化这个链条?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Tim S.    11 年前

    如果 T 是一个 class ,同时具有 itemsDictionary itemsList 意味着您有两个对相同内存位置的引用。假设每个项目都是大的,例如复杂的对象,这是可以忽略的(每个项目4或8个字节,取决于您运行的是32位还是64位)。如果项目是 struct s、 然而,这意味着它们将被复制,并且您将使用双倍的内存。

    如果内存使用是一个问题,并且您只需要 ItemsList 在某些时候,您可能想要放弃 项目列表 字段,然后让属性动态生成:

    return ItemsDictionary.Values.ToList();
    

    另一种选择,假设您可以控制 RepositoryLoader 功能,是编写 IDictionary<,> 公开其 Values 例如 IReadOnlyList<T> 直接,而不重新创建列表。