Die über 800 MB dann so im
RAM behalten zu wollen ist dann aber wohl eher ein Designfehler in der Anwendung.
Hier würde sich dann eine MMF anbieten ... diese in der entsprechenden Größe erstellt
dann einfach nur den Bereich z.B. 4096 Bytes ab Position sound so in den Speicher mappen, die Daten da reinkopieren und dann den Bereich eventuell gleich wieder freigeben.
für alle möglichen anderen Fälle ginge z.B. sowas (also ab Delphi 2006)
dieses stellt quasi ein einfaches dynamisches Array mit gesplittetem Datenbereich dar
Delphi-Quellcode:
Type TSplittArray<Typ> = Record
Private
Var _SplittSize: Integer;
_Data: Array of Array of Typ;
Function Getter(Index: Integer): Typ; Inline;
Procedure Setter(Index: Integer; Const Value: Typ); Inline;
Public
Procedure SetSplittSize(i: Integer);
Procedure SetLength (i: Integer);
Function Length: Integer; Inline;
Function High: Integer; Inline;
Property Value[Index: Integer]: Typ Read Getter Write Setter; Default;
//Procedure Push(Const Value: Typ);
//Function Pop: Typ;
End;
Function TSplittArray<Typ>.Getter(Index: Integer): Typ;
Begin
Result := _Data[Index div _SplittSize, Index mod _SplittSize];
End;
Procedure TSplittArray<Typ>.Setter(Index: Integer; Const Value: Typ);
Begin
_Data[Index div _SplittSize, Index mod _SplittSize] := Value;
End;
Procedure TSplittArray<Typ>.SetSplittSize(i: Integer);
Begin
If Assigned(_Data) Then System.Error(reInvalidOp);
_SplittSize := i;
End;
Procedure TSplittArray<Typ>.SetLength(i: Integer);
Var i2: Integer;
Begin
i2 := System.High(_Data);
System.SetLength(_Data, (i - 1) div _SplittSize + 1);
For i2 := i2 to System.High(_Data) - 1 do
System.SetLength(_Data[i2], _SplittSize);
If i > 0 Then
System.SetLength(_Data[System.High(_Data)], i mod _SplittSize);
End;
Function TSplittArray<Typ>.Length: Integer;
Var i: Integer;
Begin
i := System.High(_Data);
Result := i * 1000 + System.Length(_Data[i]);
End;
Function TSplittArray<Typ>.High: Integer;
Begin
Result := Length - 1;
End;
{Procedure TSplittArray<Typ>.Push(Const Value: Typ);
Var i: Integer;
Begin
i := Length;
SetLength(i + 1);
Setter(i - 1, Value);
End;
Function TSplittArray<Typ>.Pop: Typ;
Var i: Integer;
Begin
i := High;
Result := Getter(i);
SetLength(i);
End;}
Ein Therapeut entspricht 1024 Gigapeut.