gpt4 book ai didi

delphi - 使用大型数组 - OutOfRam

转载 作者:行者123 更新时间:2023-12-03 15:47:17 29 4
gpt4 key购买 nike

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

  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。问题是这两个 block 需要是连续的,因此在大多数情况下,即使 500-600MB 的可用 RAM 在现代计算机上看起来不多,我也会用完 RAM。

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

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

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

<小时/>

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

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

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

最佳答案

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

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

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

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

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

关于delphi - 使用大型数组 - OutOfRam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com