我有,我創建了兩個雙維數組像這樣的算法:大型陣列工作 - 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