我正在运行一个相当大的搜索,并且收到一个System.OutOfMemoryException。
问题是我正在为我之前访问过的每个状态存储一个字符串密钥HashSet<sting>
。一旦达到约700万个元素,它就会崩溃。我的想法是我不需要能够检索字符串,只能识别它是否存在于集合中。
我似乎记得这种事情的专门数据结构,但我记不起它的名字。如果我没记错的话,它有相当恒定的内存要求并且你向它添加元素,并且它可以在某种程度上确定你是否已经为它添加了一些值。我是在做这个,还是存在。有什么提示吗?
答案 0 :(得分:3)
你可能在想Bloom filter。当您检查字符串是否在集合中时,它会为您提供概率结果。如果是的话,你总能找到它。如果不是,您仍然可能会检测到它,具体取决于您设置中的其他内容。它的内存要求会根据您添加的唯一元素的数量而发生变化,但它的远低于HashSet所占用的内容。
答案 1 :(得分:2)
在.NET中没有标准的集合,但你可以在Trie中存储很多的字符串,使用的空间比例如少得多。哈希表/集
答案 2 :(得分:2)
我认为你的意思是trie数据结构。可以使用trie替换哈希表,它具有以下优点:
答案 3 :(得分:1)
答案 4 :(得分:0)
你在谈论词典课吗?
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
摘自MSDN:
词典中的每个键都必须是唯一的 字典的平等比较。一个 key不能为null,但值可以 如果值类型TValue是a 参考类型。
您可以使用ContainsKey
方法检查在插入新记录之前是否已插入条目。