C#Dictionary:访问速度更快但内存占用更少

时间:2011-02-16 08:07:14

标签: c# performance dictionary

我希望以最小的内存占用和最大的访问性能来建议存储和访问的最佳方式。

EG。 对于每辆车,我想存储型号和名称。

我在下面有一些想法:

选项1:

Dictionary<string, Dictionary<string, string>> values = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> list = new Dictionary<string, string>();
list.Add("2001", "Jetta S");
list.Add("2002", "Jetta SE");
list.Add("2002", "Jetta LE");
values.Add("VolksWagen", list);

选项2:

Dictionary<string, List<KeyValuePair<string, string>>> values2 = new Dictionary<string, List<KeyValuePair<string, string>>>();
<pre lang="xml">List<KeyValuePair<string, string>> list2 = new List<KeyValuePair<string, string>>();
list2.Add(new KeyValuePair<string, string>("2001", "Jetta S"));
list2.Add(new KeyValuePair<string, string>("2002", "Jetta SE"));
list2.Add(new KeyValuePair<string, string>("2002", "Jetta LE"));
values2.Add("VolksWagen", list2);

选项3:

Dictionary<string, List<string>> values1 = new Dictionary<string, List<string>>();
List<string> list1 = new List<string>();
list1.Add("2001:Jetta S");
list1.Add("2002:Jetta SE");
list1.Add("2002:Jetta LE");
values1.Add("VolksWagen", list1);
  • 选项1:更快地访问make和 名称,但大多数内存占用
  • 选项2:快速访问make和 名称但内存占用更多​​
  • 选项3:缓慢访问make和 name(必须解析它)但是 内存占用更少

上面会有超过1500个词典。

对于快速访问但内存占用较少的任何建议都表示赞赏?

感谢。

4 个答案:

答案 0 :(得分:19)

SortedList<TKey,TValue>是一个平面列表(所以内存占用量没有大幅增加),它使用二进制搜索进行访问 - 所以O(log(n)) - 所以不如Dictionary<TKey,TValue> O(1)那么快1}} - 但比List<T>上的O(n)(或其他线性搜索)要好得多。

如果您希望最快访问,则需要为哈希表使用额外的内存。

作为旁注,SortedList<TKey,TValue>还允许通过int index 高效访问,这对SortedDictionary<TKey,TValue>来说很难,对Dictionary<TKey,TValue>几乎毫无意义。< / p>

显然,在您的场景中,您可能需要 SortedList<,>与嵌套或复合键结合使用 - 但IMO将是获得内存和访问器平衡的最佳途径-性能。您可以使用专用复合键,即 iummutable struct与复合键成员,覆盖GetHashCode()Equals,实现IEquatable<T>,以及用于排序:实施IComparableIComparable<T>

答案 1 :(得分:2)

您不应该主要通过内存“足迹”来选择数据结构,而是选择访问模式:您想要做的最常见的查找是什么,结构更新的频率等等。

如果您想填充结构一次,然后按制造和建造年份查看汽车,第一种方法似乎最合理(并且可读/可理解)。

顺便说一下,考虑到一年内可以发布多个模型的事实,你应该使用Dictionary<string, Dictionary<string, List<string>>>。如果您想要存储多年,则不应使用字符串作为键,而应使用Int16

答案 2 :(得分:2)

您可以Dictionary使用NameValueCollection

var values = new Dictionary<string, NameValueCollection>();
NameValueCollection list = new NameValueCollection();
list.Add("2001", "Jetta S");
list.Add("2002", "Jetta SE");
list.Add("2002", "Jetta LE");
values.Add("VolksWagen", list);

或者使用集合初始化程序:

var values = new Dictionary<string, NameValueCollection> 
    { 
        { "VolksWagen", new NameValueCollection 
            { 
                { "2001", "Jetta S" }, 
                { "2002", "Jetta SE" }, 
                { "2002", "Jetta LE" } 
            } 
        } 
    };

虽然我不是内存占用专家,但恕我直言,这将为您提供这种特定情况下的最佳访问模式。

答案 3 :(得分:1)

在谈到数据结构中的访问权限时,了解读取访问权限和写入访问权限之间的区别非常重要。对于字典,如果我没有记错的话,您O(1) value key O(log(n))的{​​{1}}时间可以访问O(1)。使用普通列表时,总是O(n)要添加,但访问数据的时间O(n)。至于内存占用,它几乎是相同的:list.Add("2002", "Jetta SE"); list.Add("2002", "Jetta LE"); 在最坏的情况下。

您需要存储/访问多少个值? 根据您的代码示例,

选项1:不合适:

Dictionary<string, List<KeyValuePair<string, string>>>

键必须是唯一的,所以

选项2:{{1}} 是你需要的。