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

2023-11-29

当应用程序运行时,我需要在内存中存储、读取和修改大量数据。数据可以比作一棵树,其中每个节点由有限数量的字符串和整数描述,并且具有相当多的子元素。 目前数据是使用类/对象存储的,例如

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(使用前将#替换为@)

Delphi:将数据存储在类与记录中,减少内存使用 的相关文章

随机推荐

  • 虚函数和纯虚函数之间的区别[重复]

    这个问题在这里已经有答案了 纯虚函数和虚函数有什么区别 我知道 纯虚函数是一个没有函数体的虚函数 但这是什么意思以及下面的行实际上做了什么 virtual void virtualfunctioname 0 虚函数使其类成为多态基类 派生类
  • 为什么这个分支会破坏类型推断?

    我正在使用一个自行开发的实现Either在Java中 有这样的方法 public static
  • 嵌套的弹性元素不会使父元素增长

    我正在尝试编写一个标题 其中包含月份名称以及该月名称正下方的所有日期 天项目具有固定宽度 所以我想 为什么不使用 Flexbox 由于某些原因 day其父级元素正在下降 并且父级元素不会增长 你能告诉我为什么吗flex basis auto
  • 如何使用Python和Cypher在Apache Age中实现最短路径算法?

    我正在开发一个使用 Apache Age 作为图形数据库的 Python 项目 我需要找到两个可能节点之间的最短路径 我如何使用 Python 来实现这个 创建节点和图结构的代码如下 Python code to create nodes
  • 如何创建在设备和佩戴上不同的通知?

    基本上 我想知道是否有可能创建两个不同的通知以及如何创建 一个用于 Android 设备 另一个用于 Android Wear 例如 我想要setContentText 但在 Android 设备上我想要setContentTitle an
  • 在 ObservableList 上调用clear()会导致IndexOutOfBoundsException

    我有一个带有可观察列表的组合框 该列表会随着用户输入字符或进行选择而更新 我遇到的问题是当我从 ComboBox 中选择一个项目并调用侦听器事件 然后调用 ComboBox 的 ObservableList 中的clear 方法时引起的 完
  • Android TCP 应用程序挂在 inStream.readline() 上

    这是一个延续这个问题因为它回答了我原来的问题 但它没有解决错误 问题 如何修复挂在这一行的代码inStream readline 我的意图 这是在一个线程中 该线程将循环检查是否有 outMessage 如果有 它将发送消息 接下来 它将检
  • 如何在 Vim 中实现类似 MATLAB 的单元格模式

    在 MATLAB 中 我们可以向编辑器写入以下内容 a example cell plot rand 3 another cell A rand 2 10 t linspace pi pi 2 10 compass fft A sin t
  • 将 Parceler (@Parcel) 与 Realm.io (Android) 一起使用

    我有以下代码会产生错误 Error Parceler Unable to find read write generator for type io realm Realm for io realm RealmObject realm 一切
  • MATLAB 中的稳定 AccumArray

    MATLAB的内置函数accumarray接受一个函数fun作为第四个参数 A accumarray subs val sz fun 这适用fun到每个元素子集val具有相同的下标subs 然而 该文档指出 如果下标在subs未根据其线性索
  • 在下拉列表内的树层次结构中显示类别/子类别

    我有一个类别表 其中包含字段 id name 和parent id 根类别的parent id 0 现在我想在下拉列表中显示类别列表 结构如下 root category first sub category sub sub categor
  • .NET 4 GUID 是如何生成的?

    我知道有很多问题here以及雷蒙德的出色 像往常一样 post 然而 由于创建 GUID 的算法明显发生了变化 我发现很难获得任何最新信息 这MSDN似乎试图提供尽可能少的信息 关于 NET 4 中如何生成 GUID 我们了解多少 更改了什
  • ID 保存并显示名称 - 带芯片的材质 ui 多选

    我正在使用基于文档示例的 Material UI Multiple Select 我需要保存所选选项的 ID 和显示名称 我尝试了很多方法但没有任何帮助 我需要存储 id 并显示值 请帮助我指导 这是我的代码和盒子link 我也想知道同样的
  • 奇怪的谷歌地图行为 - 瓷砖仅出现在左上象限

    使用谷歌地图数十次 但无法绕过这一点 为地图版本 3 执行 google 的简单 hello world http code google com apis maps documentation javascript tutorial ht
  • 赋值关联性[重复]

    这个问题在这里已经有答案了 赋值运算符有右到左关联性 所以 var x y x y 1 按预期工作 x 等于 1 现在考虑代码 var foo foo x foo n 2 我希望上面的工作像下面这样 var foo n 2 foo x fo
  • 管理两个 NSURLConnection

    我想从两个不同的 kml 文件执行两个异步请求 因此我首先设置两个请求 NSString server1URL NSString stringWithFormat NSMutableURLRequest firstRequest NSMut
  • Github 操作在作业之间共享工作空间/工件?

    尝试使用 Github 的 beta 操作时 我有两项工作 一项是构建代码 另一项是部署代码 但是 我似乎无法在部署作业中获取构建工件 我最新的尝试是为每个作业手动设置具有相同卷的容器映像 根据文档 这应该是解决方案 https help
  • python:类 super() 的代理对象,在指定的类处启动 MRO 搜索

    根据文档 super cls obj returns 将方法调用委托给父级或同级的代理对象 cls 类型的类 我明白为什么super 提供此功能 但我需要稍微不同的东西 我需要创建一个代理对象 将方法调用 和属性查找 委托给类cls本身 和
  • 如何从“请告知 Microsoft 此事”对话框中获取错误报告?

    我编写的一个程序在启动时崩溃 Windows XP 对话框 请告诉 Microsoft 有关此问题的信息 出现 我想知道这个问题 因为这是我的应用程序 问题是 单击 单击链接 查看错误报告的内容 错误报告内容 对话框不允许我的客户将其内容复
  • Delphi:将数据存储在类与记录中,减少内存使用

    当应用程序运行时 我需要在内存中存储 读取和修改大量数据 数据可以比作一棵树 其中每个节点由有限数量的字符串和整数描述 并且具有相当多的子元素 目前数据是使用类 对象存储的 例如 TRootElement class fName fDesc