加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:在类和记录中存储数据,减少内存使用量

发布时间:2020-12-15 10:12:01 所属栏目:大数据 来源:网络整理
导读:在应用程序运行时,我在内存中存储,读取和修改了大量数据.可以将数据与树进行比较,其中每个节点由有限数量的字符串和整数描述,并且具有相当多的子元素. 目前,数据是使用类/对象存储的,例如 TRootElement = class fName,fDescription: string; fPos: integer;
在应用程序运行时,我在内存中存储,读取和修改了大量数据.可以将数据与树进行比较,其中每个节点由有限数量的字符串和整数描述,并且具有相当多的子元素.
目前,数据是使用类/对象存储的,例如
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 pointer但是记录中不存在.当您考虑权衡时,这种差异通常可以忽略不计:为了节省四个字节,您放弃了继承,多态,数据隐藏和其他面向对象的功能. (其中一些可能会通过Delphi的新“记录方法”来缓解,但如果你只有Delphi 2005,那么你还没有这个功能.)

实际上,如果这四个字节确实对您的程序产生了影响,那么您可能需要解决更大的问题.只需在树中添加另一个节点即可消除四字节的节省.使用足够大的数据集,无论你创建任何一个节点有多小都无关紧要,因为无论如何你都无法将它们全部保存在内存中.您需要调查某种缓存方案,因此只有一些节点保留在内存中,其余节点保存在其他位置,例如文件或数据库中.

如果用双链接的节点列表替换当前列表,您可能会看到内存使用量增加,因为现在每个节点都跟踪其下一个和前一个邻居,而在TObjectList管理所有这些之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读