我有一个算法,可以创建两个二维数组,如下所示:
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
(因为数据在内存中的放置方式)。因此,将数组分成独立的行可能会影响速度。