使用大型数组 - OutOfRam

2024-04-08

我有一个算法,可以创建两个二维数组,如下所示:

  TYPE
   TPtrMatrixLine = array of byte;
   TCurMatrixLine = array of integer;
   TPtrMatrix     = array of TPtrMatrixLine;                                    
   TCurMatrix     = array of TCurMatrixLine;  


  function x
  var  
     PtrsMX: TPtrMatrix;
     CurMx : TCurMatrix;         
  begin 
   { Try to allocate RAM }
   SetLength(PtrsMX, RowNr+1, ColNr+1);                              
   SetLength(CurMx , RowNr+1, ColNr+1);
   for all rows do 
    for all cols do 
     FillMatrixWithData; <------- CPU intensive task. It could take up to 10-20 min
  end;

这两个矩阵始终具有相同的维数。 通常矩阵中只有 2000 行和 2000 列,但有时它可能高达 25000x6000,因此对于这两个矩阵,我需要 146.5 + 586.2 = 732.8MB 的 RAM。 问题是这两个块需要是连续的,因此在大多数情况下,即使 500-600MB 的可用 RAM 在现代计算机上看起来不多,我也会用完 RAM。

该算法根据该单元格的邻居使用数据填充数组的单元格。运算只是加法和减法。

TCurMatrixLine 需要大量 RAM,因为它使用整数来存储数据。不幸的是,存储的值可能有符号,所以我不能使用 Word 代替整数。 SmallInt 太小(我的值比 SmallInt 大,但比 Word 小)。我希望如果有任何其他方法来实现这一点,它不需要增加大量开销,因为处理具有如此多行/列的矩阵已经花费了大量时间。换句话说,我希望减少内存需求不会增加处理时间。

知道如何减少内存需求吗? [我使用Delphi 7]


Update有人建议我的数组的每一行应该是一个独立的一维数组。 我根据需要创建尽可能多的行(数组)并将它们存储在 TList 中。听起来很好听。显然分配这么小的内存块不会有问题。但恐怕会对速度造成巨大影响。我现在用

TCurMatrixLine = array of integer;                                   
TCurMatrix     = array of TCurMatrixLine; 

因为它比TCurMatrix= array of array of integer(因为数据在内存中的放置方式)。因此,将数组分成独立的行可能会影响速度。


使用有符号 2 字节整数的建议将对您有很大帮助。

另一个有用的策略是将您的 exe 标记为LARGE_ADDRESS_AWARE通过增加{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}到您的 .dpr 文件。仅当您在 64 位 Windows 上运行时这才会有帮助,并且会将您的地址空间从 2GB 增加到 4GB。

它可能无法在 Delphi 7 上运行(我似乎记得您正在使用 D7),并且您必须使用 FastMM,因为旧的 Borland 内存管理器与大地址空间不兼容。如果$SetPEFlags不可用,您仍然可以用 标记 exeEDITBIN.

如果您仍然遇到困难,那么另一个技巧是分配较小的内存子块,并使用包装器类来处理将索引映射到适当的子块和其中的偏移量。您可以使用默认索引属性使其对调用代码透明。

当然,像这样的块分配方法确实会产生一些处理开销,但如果您在获取连续块时遇到麻烦,那么这是您最好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用大型数组 - OutOfRam 的相关文章

  • 以高效的方式将字符串转换为十六进制

    我开发了以下函数将字符串转换为十六进制值 function StrToHex const S String String const HexDigits array 0 15 of Char 0123456789ABCDEF var I I
  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • Delphi RTTI,已发布的属性出现两次

    我想对属性使用属性 但这些属性偶尔会在继承的类中发生更改 这是一个示例代码 非常简化 TBaseClass class TObject private FFoo string published BaseAttirib hello prop
  • 是否有适用于 >= Delphi 2007 的 Delphi 混淆器

    我曾经使用 Pythia 来混淆我的 D6 程序 但 Pythia 似乎不再适用于我的 D2007 这是 Pythia 的链接 自 2007 年初以来没有更新 http www the interweb com serendipity in
  • 在 Delphi 中强制非阻塞临时提示窗口

    我一直在寻找 但找不到解决方案 所以我想也许我应该简单地发布它 这是我想要在 Delphi 2009 中做的事情 在我的应用程序中的某个时刻 我想向用户显示一条消息 这应该是正常的提示窗口 在正常应用程序定义的提示暂停后自动消失 并带有自定
  • 在 Inno Setup 中使用 StringToColor

    我想为表单上的标签 TNewStaticText 属性颜色 TColor 读写 分配一些颜色 我将颜色存储为 RRGGBB 字符串 我想使用 Delphi 函数 StringToColor 将其转换为 TColor 但如果我在脚本中使用此函
  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • vcl组合框并不总是显示它有焦点

    当我从另一个控件切换到组合框时 它会显示文本周围带有虚线的框 但是当我以编程方式将控件设置为活动状态时 它不会显示相同的焦点指示器 这种行为有解决方法吗 我有德尔福XE6 MCVE unit Unit27 interface uses Wi
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • Delphi (Indy) TIdTCPClient 在线程中

    在互联网上 我看到通常将 TIdTCPClient 放置在自定义 TThread 后代中 为什么要这样做 有时我也在这样的线程中看到服务器 为什么 干杯 阿德里安 Indy 使用阻塞 I O 最好在线程中处理 这是 Indy 整体设计的核心
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 使用 OLE 和 Delphi 提高 Word 文档中搜索替换的性能

    经过一些实验 我最终得到了以下代码来在 MSWord 中执行搜索和替换 此代码在页眉和页脚中也能完美运行 包括首页或奇数 偶数页的页眉和 或页脚不同的情况 问题是我需要打电话MSWordSearchAndReplaceInAllDocume
  • 德尔福数据结构

    我可能需要在 Delphi 中做一个项目 并且是该领域的初学者 目前 我正在网上搜索资源 但由于资源站点太少而感到困惑 首先 你能给我一些好的网站 其中包含我迄今为止错过的 Delphi 资源吗 我也在 Delphi 中搜索数据结构 想知道
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • TObjectList.Contains 导致 Delphi 2009 中的访问冲突

    在 Delphi 2009 中 到目前为止 我在泛型方面没有遇到大问题 使用 Generics Collections 列表 没有特殊的泛型功能 现在我发现这段代码会在访问的行中导致AVMyList Contains 如果我声明 TMyLi
  • Delphi AES 库 (Rijndael) 使用 KAT Vectors 进行测试

    对于这两个库 Delphi 加密概要 v 5 2 http code google com p delphidec TurboPower 密码箱 v 2 07 http lockbox seanbdurkin id au tiki list
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba

随机推荐