C# 在C语言中管理大型对象#

C# 在C语言中管理大型对象#,c#,memory-management,C#,Memory Management,我有很多像树一样的结构。我有一个问题,应用程序使用的内存量开始接近>1GB,这意味着机器性能下降,并且内存不足 我通过使用sqlite将对象放到表中,从而有效地管理数据,从而解决了这个问题,但这不再是一个可行的解决方案(因为我不在这里讨论的原因) 你对管理这类事情有什么建议? 我没有(真实的)数据库可供使用,因此我认为解决方案应该是以某种方式模仿sqlite过程并使用一些文件回存-纯dot net中是否已经存在任何东西,还是您自己的情况比较复杂 听起来你需要调查一下。我没有用过这个,但它似乎是一

我有很多像树一样的结构。我有一个问题,应用程序使用的内存量开始接近>1GB,这意味着机器性能下降,并且内存不足

我通过使用sqlite将对象放到表中,从而有效地管理数据,从而解决了这个问题,但这不再是一个可行的解决方案(因为我不在这里讨论的原因)

你对管理这类事情有什么建议?
我没有(真实的)数据库可供使用,因此我认为解决方案应该是以某种方式模仿sqlite过程并使用一些文件回存-纯dot net中是否已经存在任何东西,还是您自己的情况比较复杂

听起来你需要调查一下。我没有用过这个,但它似乎是一个很好的起点


基本上,您将使用。

以下几个明显的问题: 1.为什么需要同时存储这么大的树结构? 2.这些数据首先来自哪里

无论您对这些问题的答案是什么,您都可能不需要一次性将所有数据存储在内存中。将大量数据持久保存到磁盘,并只读取您当时需要的位。看起来这就是你要去的方向。在.NET中,除了RDM之外,还有许多可能存储数据的地方;平面文件、xml文件、独立存储等等。或者您可以让任何系统向您提供这些数据(问题2),以便一次将其提供给较小的位?
如果您绝对需要在内存中存储大型树结构。研究一些树形结构算法,甚至可能是数据压缩?

是免费的。

当您开始存储大量对象时,对象分配开销成为一个真正的问题。例如,在32位系统上运行.NET时,分配任何对象至少需要16个字节。在64位系统上,每个对象的最小字节数为24。如果您的单个对象很小,那么分配开销将是一个巨大的代价

您说过您有一个“树状结构”。没有关于您的应用程序的更多细节,我不能肯定这是否适用,但大多数树结构需要指向子节点的指针,有时还需要指向父节点的指针。尽管树木很有用,但它们有时会产生很大的开销。父链接和子链接需要树使用的总内存的50%或更多,这种情况并不少见

在C#中,可以通过使用结构而不是对象来减轻分配开销,因为结构基本上没有分配开销。当然,缺点是您必须处理有时非常不方便的值类型语义

也可以将许多树结构折叠成数组,消除子链接和父链接,从而节省大量内存。这通常是以更复杂的代码和运行时效率的损失为代价的

在我的工作中,我经常需要在内存中保存非常大的集合(数亿个节点)。当内存中有2.5亿条记录时,节点中每四个字节就需要另一个GB的RAM。即使在16G的机器上,维护这样的数据结构也需要非常仔细地考虑内存的使用方式


如果您必须将整个内容保留在内存中,那么我建议您尽可能创建树节点结构。您还应该考虑存储树的替代方法——消除与父或子的显式链接的方法。如果没有关于您的特定应用程序的更多信息,我无法提出更具体的建议

数据来自一个不可查询的数据源——它是整个源元素,或者什么都没有。整个结构保持不变,因为最终显示取决于树中结果的数量。我对第三方(我的公司:)设置的解决方案有限制。在我的工作流中,我添加了一个新步骤,将数据持久化到动态定义的数据集中,并强制GC-到目前为止,其工作正常。谢谢你的提示!