【发布时间】:2012-05-30 00:39:09
【问题描述】:
我需要存储大量唯一路径,例如:"C:\MyDir\MySubDir\myfile.txt"。
我希望能够快速检查我的集合中是否包含路径,以及以上,以尽可能减少内存。
最适合这个任务的collection是什么?
是否可以存储一个表示唯一路径的值,而不是字符串本身,以使用更少的内存?
【问题讨论】:
标签: .net memory-management collections
我需要存储大量唯一路径,例如:"C:\MyDir\MySubDir\myfile.txt"。
我希望能够快速检查我的集合中是否包含路径,以及以上,以尽可能减少内存。
最适合这个任务的collection是什么?
是否可以存储一个表示唯一路径的值,而不是字符串本身,以使用更少的内存?
【问题讨论】:
标签: .net memory-management collections
看看Trie,我们用 2000 万条路径做得非常高效
【讨论】:
哈希集,如果您需要快速访问数据,即如果您想在 O(1) 时间内知道集合中是否存在某些内容。
在 .NET 4 中,使用 HashSet。它就像一个哈希表,但只存储值,而不是键/值对。
HashSet<string> myStrings = new HashSet<string>();
myStrings.Add(@"c:\foo\bar.txt");
myStrings.Add(@"c:\foo\baz.gif");
myStrings.Add(@"c:\foo\bat.bin");
【讨论】:
这最适合TRIE。这是一个示例:implementing a trie in c#。
要回答您的问题,是的,TRIE 存储唯一路径而不是字符串本身。
尝试对您的任务非常有效,无论是在内存消耗方面还是在执行速度方面。
编辑: 并不是说一个比另一个好,TRIE 是针对这种类型的存储/检索问题而发明的,并且非常有效。 散列也很快。如果您想知道哪一个最适合您的需求,请同时实施。无论哪种方式,都不应该花很长时间。 测量,测量,测量。
【讨论】:
通常用于存储唯一数据点的数据结构是集合。您可以为此使用 .NET HashSet<T> 类。使用 HashSet,您不必在添加值之前检查它是否存在,并且您也可以快速查找。
【讨论】:
您为什么不使用 Dictionary/HashTable 来快速查找集合。
“可以存储一个表示唯一路径的值..”- 想想这个,每次你必须检查集合中是否存在某个值时,你必须加密/解密你的字符串。不好的方法
编辑: 如果速度不是问题,为什么不将所有键存储在数据库中,然后您可能可以在表中快速循环查看路径是否存在?
【讨论】: