C# C语言中的内存异常

C# C语言中的内存异常,c#,.net,memory,memory-management,data-structures,C#,.net,Memory,Memory Management,Data Structures,可能重复: 我正在尝试实现一个树,该树将容纳数百万个节点,而这些节点又可以包含数量不确定的子节点 为了实现这一点,因为每个节点可以有多个子节点,所以我将节点的子节点存储在字典数据结构中。因此,当用数百万创建每个对象节点时,我得到了一个节点对象,其中包含存储在各个节点中的字符值,以及一个单独的字典结构,其中包含对子节点的引用 我的树适用于几千个节点,但是当它达到数百万个节点时,就会出现内存不足异常。这是因为在内存中运行的数百万个节点中的每一个都有自己的字典吗?i、 我有数百万个物体在运转 我需要

可能重复:

我正在尝试实现一个树,该树将容纳数百万个节点,而这些节点又可以包含数量不确定的子节点

为了实现这一点,因为每个节点可以有多个子节点,所以我将节点的子节点存储在字典数据结构中。因此,当用数百万创建每个对象节点时,我得到了一个节点对象,其中包含存储在各个节点中的字符值,以及一个单独的字典结构,其中包含对子节点的引用

我的树适用于几千个节点,但是当它达到数百万个节点时,就会出现内存不足异常。这是因为在内存中运行的数百万个节点中的每一个都有自己的字典吗?i、 我有数百万个物体在运转


我需要让这些对象在内存中运行,不能使用文件或数据库。有人能提出解决方案吗?

您可以尝试使用64位Windows,并以64位编译程序。这会给你更多的记忆。。。这不是一个灵丹妙药,内存结构的大小仍然有限制

您可以尝试使用64位Windows,并以64位编译程序。这会给你更多的记忆。。。这不是一个灵丹妙药,内存结构的大小仍然有限制

您可以阅读Windows版本的内存限制

考虑使用64位

看看这个问题:

对于您的场景,请尝试使用BigArray


您可以阅读Windows版本的内存限制

考虑使用64位

看看这个问题:

对于您的场景,请尝试使用BigArray


解决办法并不容易

选项包括:

将这些节点中的一些卸载到磁盘上,在磁盘上可以处理更多的工作空间。只在内存中加载真正需要的内容。由于磁盘和RAM速度之间的根本差异,这可能会导致巨大的性能损失

增加机器中的RAM数量,以适应您正在进行的操作。如果当前是32位应用程序,则可能需要移动到64位。根据您的实际内存需求,这可能非常昂贵。当然,如果你现在有一个32位的应用程序,并且有足够的内存可用,那么切换到64位至少会使你的内存超过3到4GB的范围

流线使每个节点的占地面积小得多。换句话说,您需要Dictionary提供的一切,还是只需要定义到其他节点的左右链接的结构就可以了?基本上,看一下您需要如何处理这个问题,以及处理树数据结构的传统方法


解决办法并不容易

选项包括:

将这些节点中的一些卸载到磁盘上,在磁盘上可以处理更多的工作空间。只在内存中加载真正需要的内容。由于磁盘和RAM速度之间的根本差异,这可能会导致巨大的性能损失

增加机器中的RAM数量,以适应您正在进行的操作。如果当前是32位应用程序,则可能需要移动到64位。根据您的实际内存需求,这可能非常昂贵。当然,如果你现在有一个32位的应用程序,并且有足够的内存可用,那么切换到64位至少会使你的内存超过3到4GB的范围

流线使每个节点的占地面积小得多。换句话说,您需要Dictionary提供的一切,还是只需要定义到其他节点的左右链接的结构就可以了?基本上,看一下您需要如何处理这个问题,以及处理树数据结构的传统方法


OOM异常可能是由于LOH碎片,而不是实际内存不足。您可以尝试切换到SortedDictionary,它使用红黑树,而不是Dictionary,它使用哈希表,然后看看这是否会改善问题。或者您可以实现自己的树结构。

您的OOM异常可能是由于LOH碎片,而不是实际内存不足。您可以尝试切换到SortedDictionary,它使用红黑树,而不是Dictionary,它使用哈希表,然后看看这是否会改善问题。或者您可以实现自己的树结构。

如果您唯一的限制是不能访问文件,那么我可以建议另一种解决方案如果您反对任何类型的数据库,这个答案是没有实际意义的-是使用内存中的数据库,例如或其他提供类似功能的数据库。这将在许多方面对您有所帮助,其中最重要的一点是数据库将为您执行内存管理,并且有许多经过验证的算法可用于在数据库中存储大型树,您可以进行调整


希望这有帮助

如果您的o 唯一的限制是不允许文件访问。如果您反对任何类型的数据库,这个答案是没有意义的,即使用内存中的数据库,如或其他提供类似功能的数据库。这将在许多方面对您有所帮助,其中最重要的一点是数据库将为您执行内存管理,并且有许多经过验证的算法可用于在数据库中存储大型树,您可以进行调整


希望这有帮助

这对你有什么好处?它可读吗?为什么不能使用文件或数据库?您可以将dictionary对象更改为一个数组作为一个数组。您可以向我们展示节点类的结构吗?您使用的键类型是什么?对于主字典和叶字典。您的数据结构只是字典还是什么?我建议您阅读一下如何实现树,因为您正处于一个高效实现显然很重要的阶段。这对您有什么好处?它可读吗?为什么不能使用文件或数据库?您可以将dictionary对象更改为一个数组作为一个数组。您可以向我们展示节点类的结构吗?您使用的键类型是什么?对于主字典和叶字典。您的数据结构只是字典还是什么?我建议您阅读一下如何实现树,因为您正处于一个高效实现显然很重要的阶段。@KeithS我很高兴您这么认为,但事实上这完全不同。单个对象限制为2GB,因此Dor CohenKeithS建议使用BigArray的原因是:我认为这是不正确的:@KeithS我很高兴你这么认为,但事实上这完全不同。单个对象限制为2GB,因此Dor CohenKeithS建议使用BigArray的原因是:我认为这是错误的: