我有,我创建了两个双维数组像这样的算法:大型阵列工作 - OutOfRam
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在现代计算机上看起来并不多,但我的内存不足。
该算法用基于该单元的邻居的数据填充该数组的单元。这些操作只是加法和减法。
TCurMatrixLine是一个需要很多或RAM,因为它使用整数来存储数据。不幸的是,存储的值可能有符号,所以我不能使用Word而不是整数。 SmallInt太小(我的值比SmallInt大,但比Word小)。我希望如果有任何其他方式来实现这一点,它不需要增加很多开销,因为处理具有这么多行/列的矩阵已经花费了很多时间。换句话说,我希望减少内存需求不会增加处理时间。
任何想法如何降低内存要求? [I使用Delphi 7]
更新 有人建议,我的阵列的每一行应是一个独立单维数组。 我根据需要创建了很多行(数组)并将它们存储在TList中。听起来很不错。显然,不会有问题分配这样的小内存块。但我担心它会对速度产生巨大影响。我现在用
TCurMatrixLine = array of integer;
TCurMatrix = array of TCurMatrixLine;
,因为它的速度比TCurMatrix= array of array of integer
(因为数据被放置在内存的方式)。因此,以独立线条打破阵列可能会影响速度。
“SHORT”或“Smallint”是一个有符号的16位整数。这与'WORD`具有相同的尺寸。 – 2011-02-08 13:51:49
矩阵中会有多少个空条目?对于稀疏矩阵(具有默认值的许多条目),列表表示可能更紧凑。 – jpfollenius 2011-02-08 14:01:47
如上所述,SmallInt太小(我的值比SmallInt大,但小于Word)。 – Ampere 2011-02-08 14:39:51