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

时间:2013-10-17 13:16:44

标签: c# caching properties memorycache

我们有一个将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 ...

我的问题是 - 你可以看到它也通过2个缓存属性 - 是否会在内存消耗上创建重复? :)有没有办法优化这个链?

1 个答案:

答案 0 :(得分:1)

如果Tclass,同时拥有itemsDictionaryitemsList意味着您有两个对相同内存位置的引用。假设每个项目都很大,例如复杂的对象,这可以忽略不计(每个项目4或8个字节,具体取决于你是运行32位还是64位)。但是,如果项目为struct s,则表示它们将被复制,并且您将使用双倍的内存。

如果内存使用率存在问题且您在某些时候只需要ItemsList,则可能需要删除itemsList字段,然后让该属性动态生成:< / p>

return ItemsDictionary.Values.ToList();

假设您可以控制RepositoryLoader功能,另一个选项是编写一个IDictionary<,>实现,将其Values公开为,例如直接IReadOnlyList<T>,无需重新创建列表。