我正在寻找.net的trie实现。
我打算将它用作内存中对象池的索引结构。它不需要是线程安全的(因为只有一个线程会更新它)但应该能够优雅地处理至少2000万个项目并且具有持续的性能。
我在网上找到的那些似乎是示例代码或玩具项目。所以,我真的在寻找一个生产质量的实施。如果可以的话,商业图书馆也可以。
PS:我选择了尝试,因为我看到哈希表实现看起来使用了太多内存,并且因为它们基于数组而导致内存碎片化。任何具有O(1)查找特性和大量项目的良好内存使用特性的容器也可以。
谢谢,
答案 0 :(得分:0)
在我个人看来,试图猜测.Net自己的内存管理并不是我推荐的做法。您根本无法在本机方案中对内存分配施加控制级别,但同样您不应该这样做。当我第一次离开C ++(我会经常使用自己的堆并编写内存本地化例程等)时,我一直渴望这样做,但很快就显而易见,我只是不需要,也不是< em>可以我。
例如,您可以在trie的底部有一个MyPooledObject
数组,但是,如果这是一个引用类型,那么您只需要一个引用数组,其中每个引用的实际内存在其他地方 - 你无法控制(除非你为运行时调整自己的主机)。
留下使用值类型 - 但这些根本不适合在池化场景中使用,因为自定义值类型应该是不可变的(我可以安全地说它没有理由 - 只是谷歌'不可变'和'结构'targeting site:stackoverflow.com以查看更多信息)因此无法将其视为可重用对象。
如果您需要.Net中的索引集合,其中每个对象都可以使用具有哈希功能的密钥进行识别,那么请使用字典。
如果你有太多的物体不适合记忆,那么:
1)获得更多内存
2)使用数据库并缓存它的本地段
或两者:您可以考虑查看AppFabric and its cache features,这样您就可以构建一个专门用于运行数百万个对象的内存缓存的计算机场。硬件的成本可能低于为.Net开发自己的内存管理解决方案的成本:)
答案 1 :(得分:-1)
看看这个图书馆:TrieNet
using Gma.DataStructures.StringSearch;
...
var trie = new SuffixTrie<int>(3);
trie.Add("hello", 1);
trie.Add("world", 2);
trie.Add("hell", 3);
var result = trie.Retrieve("hel");