Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一种有效的.net trie实现_.net_Collections_Trie_In Memory - Fatal编程技术网

一种有效的.net trie实现

一种有效的.net trie实现,.net,collections,trie,in-memory,.net,Collections,Trie,In Memory,我正在寻找.net的trie实现 我计划将其用作内存对象池的索引结构。它不需要是线程安全的(因为只有一个线程将对其进行更新),但应该能够优雅地处理至少2000万个项目,并具有恒定的性能 我在网上找到的似乎是示例代码或玩具项目。所以,我真的在寻找一个生产质量的实施。商业图书馆也可以,如果有的话 PS:我选择了Trys,因为我看到的哈希表实现似乎使用了太多内存,并且往往会导致内存碎片,因为它们基于数组。任何具有O(1)查找特性和大量项的良性内存使用特性的容器也可以 谢谢你,在我个人看来,尝试猜测.N

我正在寻找.net的trie实现

我计划将其用作内存对象池的索引结构。它不需要是线程安全的(因为只有一个线程将对其进行更新),但应该能够优雅地处理至少2000万个项目,并具有恒定的性能

我在网上找到的似乎是示例代码或玩具项目。所以,我真的在寻找一个生产质量的实施。商业图书馆也可以,如果有的话

PS:我选择了Trys,因为我看到的哈希表实现似乎使用了太多内存,并且往往会导致内存碎片,因为它们基于数组。任何具有O(1)查找特性和大量项的良性内存使用特性的容器也可以


谢谢你,

在我个人看来,尝试猜测.Net自身的内存管理并不是我推荐的做法。您无法像在本机场景中那样控制内存分配,但同样,您也不需要这样做。当我第一次从C++移动时,我很想做这件事(在那里我经常用我自己的堆和写内存本地化例程等),但它很快变得明显,我不需要,我也不能。 例如,您可以在trie的底部有一个
MyPooledObject
数组,但是,如果这是一个引用类型,那么您就得到了一个引用数组,其中每个引用的实际内存都在其他地方—您无法控制(除非您为运行时调整自己的主机)

这就剩下使用值类型了——但这些值类型根本不适合在池式场景中使用,因为自定义值类型应该是不可变的(我可以说这是安全的,没有理由的——只需谷歌的“不可变”和“结构”目标站点:stackoverflow.com来查看更多内容),因此不适合作为可重用对象处理

如果您需要.Net中对象的索引集合,其中每个对象都可以用支持哈希的键识别,那么请使用字典

如果内存中的对象太多,则:

1) 获得更多内存

2) 使用数据库并缓存其本地段


<>或两者兼而有之:你可以考虑一下,这样你就可以建立一个机器农场,专门运行在数百万个对象的内存缓存中。硬件的成本可能会低于为.Net开发自己的内存管理解决方案的成本:)

在我个人看来,尝试猜测.Net自己的内存管理不是我推荐的做法。您无法像在本机场景中那样控制内存分配,但同样,您也不需要这样做。当我第一次从C++移动时,我很想做这件事(在那里我经常用我自己的堆和写内存本地化例程等),但它很快变得明显,我不需要,我也不能。 例如,您可以在trie的底部有一个
MyPooledObject
数组,但是,如果这是一个引用类型,那么您就得到了一个引用数组,其中每个引用的实际内存都在其他地方—您无法控制(除非您为运行时调整自己的主机)

这就剩下使用值类型了——但这些值类型根本不适合在池式场景中使用,因为自定义值类型应该是不可变的(我可以说这是安全的,没有理由的——只需谷歌的“不可变”和“结构”目标站点:stackoverflow.com来查看更多内容),因此不适合作为可重用对象处理

如果您需要.Net中对象的索引集合,其中每个对象都可以用支持哈希的键识别,那么请使用字典

如果内存中的对象太多,则:

1) 获得更多内存

2) 使用数据库并缓存其本地段


<>或两者兼而有之:你可以考虑一下,这样你就可以建立一个机器农场,专门运行在数百万个对象的内存缓存中。硬件的成本可能低于为.Net开发自己的内存管理解决方案的成本:)

看看这个库:

使用Gma.DataStructures.StringSearch;
...
var trie=新后缀(3);
添加(“你好”,1);
trie.添加(“世界”,2);
添加(“地狱”,3);
var结果=检索(“hel”);

看看这个库:

使用Gma.DataStructures.StringSearch;
...
var trie=新后缀(3);
添加(“你好”,1);
trie.添加(“世界”,2);
添加(“地狱”,3);
var结果=检索(“hel”);

2000万件?在这种情况下,trie的内存使用量几乎肯定比字典/哈希表大——可能要大几个数量级。。。你真的需要一个内存中的对象池吗。Net本身的内存管理非常可靠。您尝试了哪些标准数据结构,并且满足了您的需要?(解释原因)2000万件?在这种情况下,trie的内存使用量几乎肯定比字典/哈希表大——可能要大几个数量级。。。你真的需要一个内存中的对象池吗。Net本身的内存管理非常可靠。您尝试了哪些标准数据结构,并且满足了您的需要?(解释原因)我实际上在.NETFramework和C5库中尝试了所有哈希表实现。哈希表的问题是它们基于数组。一旦它们的数组缓冲区被填满,它们就会尝试以双倍的容量重新分配整个结构。因此,如果系统中有大量的添加,就会导致内存碎片和内存不足错误,因为相邻的内存位置很快就会耗尽。如果一个哈希表实现不能以这种方式工作,它将非常有用,但也找不到
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");