我有大量的树状结构对象.我有一个问题,即应用程序使用的内存量开始接近> 1GB,这意味着机器上的性能下降并且存在内存不足指令.
我设法通过使用sqlite将对象放到表中来解决这个问题,从而有效地管理数据,但这不再是一个可能的解决方案(原因我不会在这里讨论).
你有什么建议来管理这类事情?我没有(真正的)数据库可供使用,所以我认为解决方案是以某种方式模仿sqlite程序并使用一些文件后备存储 - 纯点网中是否存在任何东西或者它是一个复杂的卷你自己的情况?
当您开始存储大量对象时,对象分配开销成为一个真正的问题.例如,在32位系统上运行.NET时,分配任何对象至少需要16个字节.在64位系统上,每个对象最少说24个字节.如果您的单个对象很小,那么分配开销是一个巨大的代价.
你说你有一个"树状的结构".如果没有关于您的应用程序的更多细节,我不能肯定这适用,但大多数树结构需要指向子节点和(有时)指针返回父节点.像树一样有用,它们有时会产生非常大的开销.父和子链接需要50%或更多的树使用的总内存并不罕见.
在C#中,您可以通过使用结构而不是对象来减轻分配开销,因为结构基本上没有分配开销.当然,缺点是您必须处理有时非常不方便的值类型语义.
也有可能将许多树结构折叠成数组,从而消除子链接和父链接,从而节省大量内存.这通常以更复杂的代码和运行时效率的一些损失为代价.
在我的工作中,我经常需要在内存中保留非常大的集合(数亿个节点).当内存中有2.5亿条记录时,节点中的每四个字节需要另外几千兆字节的RAM.即使在16千兆字节的机器上,维护这样的数据结构也需要非常仔细地考虑如何使用内存.
如果你必须将整个事物保存在内存中,那么我建议你尽可能地创建树节点结构.您还应该考虑存储树的其他方法 - 消除与父母或孩子的明确链接的方法.如果没有关于您的特定应用程序的更多信息,我无法提出更具体的建议.