2012-03-12 96 views
1

可能重复:
How to refer to children in a tree with millions of nodes内存异常

我想实现一个树将举行几百万个节点,这反过来又可以拥有孩子的数目不详节点。为了达到这个目的(因为每个节点可以有多个子节点),我在一个Dictionary数据结构中存储了一个节点的子节点。因此,当创建每个对象节点(数以百万计)时,我有一个节点对象,其中包含存储在相应节点中的字符值,以及一个单独的Dictionary结构,该结构持有对子节点的引用。

我的树适用于几千个节点,但是当它到达数百万个节点时,会发生内存不足异常。这是由于在内存中运行的数百万个节点中的每一个都有其自己的字典?即我有数百万个对象在运行?

我需要让这些对象在内存中运行,并且不能使用文件或数据库。任何人都可以提出解决方案

+3

这会对你有什么好处?它是否可读?为什么你不能使用文件或数据库? – 2012-03-12 15:39:18

+0

您可以将字典对象更改为一个数组。 – mydogisbox 2012-03-12 15:40:42

+3

你能告诉我们你的Node类的结构吗? – Tudor 2012-03-12 15:41:20

回答

1

您可以尝试使用64位的Windows并以64位编译程序。这会给你更多的内存......这不是一个神奇的子弹(对于多大的内存结构仍然有限制)

+1

@KeithS我很高兴你这么认为,但实际上它完全不同。一个对象被限制为2 GB(因此Dor Cohen建议BigArray的原因) – xanatos 2012-03-12 15:53:50

+0

KeithS:我认为这是不正确的:http://stackoverflow.com/questions/982051/net-max-memory-use-2gb-even - 用于-x64的组件 – thecoop 2012-03-12 15:54:49

1

解决方案不会是eas年。

选项包括:

  1. 卸载其中的一些节点的磁盘,你有“工作区”的一个更大的量来处理。只在内存中加载真正需要在那里的东西。由于磁盘和RAM速度的根本区别,这可能会导致巨大的性能损失。

  2. 增加机器中的RAM容量以适应您正在做的事情。这可能需要转移到64位(如果它目前是一个32位应用程序)。根据您的实际内存要求,这可能会非常昂贵。当然,如果你现在有一个32位的应用程序,并有足够的RAM可用,切换到64位将至少让你在3到4GB范围以上...

  3. 流线每个节点有一个很多更小的占地面积。换句话说,您是否需要Dictionary提供的所有内容,或者只需要一个结构来定义与其他节点的左右链接?基本上,看看你如何处理这个问题,并看看处理树数据结构的传统方法。

2

您的OOM异常可能是由于LOH碎片,而不是实际内存不足。您可以尝试切换到使用红黑树的SortedDictionary,而不是使用散列表的Dictionary,并查看是否改进了问题。或者你可以实现你自己的树结构。

0

如果你唯一的限制是没有文件访问(如果你反对任何一种数据库,这个答案是没有意义的),我可以建议的另一种解决方案是使用内存数据库(如SQlite)或其他的东西提供类似的功能。这将在很多方面为你提供帮助,其中最重要的是数据库将为你执行内存管理,并且有许多经过验证的算法可以将大树存储在数据库中,这些算法可以适应。

希望这会有所帮助!