当应用程序运行时,我需要在内存中存储、读取和修改大量数据。数据可以比作一棵树,其中每个节点由有限数量的字符串和整数描述,并且具有相当多的子元素。
目前数据是使用类/对象存储的,例如
TRootElement = class
fName, fDescription: string;
fPos: integer;
/// etc
end;
fDocs: TObjectList; //list of TVariable = class(TRootElement)
fClasses: TObjectList; // list of TClass=class(TRootElement)
目前程序消耗的内存是不可接受的,因此我正在寻找限制它的解决方案。
我的问题是:如果我用基于记录的架构替换当前的基于 OOP 和对象的架构,消耗是否会显着减少?例如,一般记录可以包含:
TRootElement = record
fType: TElemType; // enum: root, variable, class, etc ...
fName, fDesc: string;
// all the fields used by root elem and it's descendants there
end;
我应该用指向下一个/上一个元素的指针替换 TList 吗?由于我从不按索引访问列表的元素,所以我总是循环遍历整个列表,这应该不难做到......但是如果没有必要,我想避免它。
谢谢!
米。
将类更改为记录会减少内存使用量,但随着类或记录中字段数量的增加,节省的重要性会降低。类和相应记录之间的大小差异恰好是四个字节,这占了VMT指针一个类持有但记录中不存在该类。当您考虑权衡时,这种差异通常可以忽略不计:为了节省四个字节,您就放弃了继承、多态性、数据隐藏和其他面向对象的功能。 (其中一些问题可能会通过 Delphi 的新“带有方法的记录”得到缓解,但如果您只有 Delphi 2005,则还没有该功能。)
事实上,如果这四个字节really为你的程序带来改变,那么你可能有一个更大的问题需要解决。只需向树中添加另一个节点即可消除这四个字节的节省。有了足够大的数据集,无论你将任何一个节点设置得有多小都没关系,因为无论如何你都无法将它们全部保存在内存中。您需要研究某种缓存方案,因此只有一些节点保留在内存中,其余节点保存在其他地方,例如文件或数据库中。
如果您将当前列表替换为节点的双向链表,您可能会看到内存使用情况increase因为现在每个节点都在跟踪其下一个和前一个邻居,而在之前TObjectList
自己管理这一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)