在C#中管理大对象

时间:2009-03-14 02:19:53

标签: c# memory-management

我有大量的树状结构对象。我有一个问题,即应用程序使用的内存量开始接近> 1GB,这意味着机器上的性能下降并且内存指令不足。

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

你有什么建议来管理这类事情? 我没有(真正的)数据库可供使用所以我认为解决方案是以某种方式模仿sqlite程序并使用一些文件后备存储 - 是否已经存在于纯点网中或者它是一个复杂的卷你自己的情况?

4 个答案:

答案 0 :(得分:7)

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

你说你有一个“树状的结构”。如果没有关于您的应用程序的更多细节,我不能肯定这适用,但大多数树结构需要指向子节点和(有时)指针返回父节点。像树木一样有用,它们有时会产生很大的开销。父和子链接要求树的总内存占50%或更多的情况并不少见。

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

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

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

如果你必须将整个事物保留在内存中,那么我建议你尽可能地创建树节点结构。您还应该考虑存储树的其他方法 - 消除与父母或孩子的明确链接的方法。如果没有关于您的特定应用程序的更多信息,我无法提出更具体的建议。

答案 1 :(得分:4)

听起来你需要调查Memory Mapped Files。我没有使用过这个CodeProject article,但这似乎是一个很好的起点。

基本上你将使用Win32 to implement a memory mapped file

答案 2 :(得分:1)

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

无论您对这些问题的答案是什么,您都可能无需一次性将所有数据存储在内存中。将大量数据保留到磁盘并只读取当时所需的位。无论如何,这似乎是你要去的方向。在.NET中有许多可能的地方,你可以存储除RDMS之外的数据;平面文件,xml文件,隔离存储等等。或者你可能有任何系统正在为你提供这些数据(问题#2),一次给它一些较小的位? 如果你绝对需要在内存中存储大树结构。研究一些树形结构算法,甚至可能是数据压缩?

答案 3 :(得分:0)

SQL Server Express是免费的。