Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 17:49
Hmm..


Hmm..

oder zunächst mal aus tframes ein TObject statt Record machen

und aus frametab eine ObjectList.

Dadurch beinhaltet frametab nur 131072 Pointer auf tframes, die irgendwo 'verstreut' im Speicher liegen und somit nicht mehr zusammenhängend sein müssen.
Für was ein Objekt, das wesentlich mehr Speicher verbrät ?

Besser:

Delphi-Quellcode:
  Type
    PFrames = ^TFrames
und dann schlicht mit einer TList arbeiten.

Ich glaube kaum, dass

Delphi-Quellcode:
type tframes = class
a: integer;
f: array [1..9999] of tfiguren;
end;
anstelle von

Delphi-Quellcode:
type tframes = record
a: integer;
f: array [1..9999] of tfiguren;
end;
Wirklich wesendlich mehr an Speicher verbraucht. Das gro an Speicher braucht das 'array [1..9999] of tfiguren;' und nicht das TObject.
Ich bin zwar kein Spezialist was Speichermanagment angeht, sollten eigentlich nur ein, zwei Pointer mehr an Speicher sein, wenn überhaupt.


Aber egal..

Ja man kann TList direkt mit Pointer auf Records verwenden, jedoch dann darauf achten, das mit AllocMem/GetMem immer der Speicher des Records geholt wird und zum Schluss schön mit FreeMem wieder freigegeben wird.

Bei Objectlist würde sich durch ownsobject die Liste selber um die (saubere) Freigabe kümmern.

Edit:
Habe mal durch Delphi die Größen ermitteln lassen:

Record 159988 Bytes (mit SizeOf)
Object 159992 Bytes (mit Object.InstanceSize)

Somit macht dass bei 32Bit gerade mal 4 Bytes mehr pro Object! Bei 159988 Bytes ist das wohl nicht Wesendlich mehr.

Hochgerechnet auf 131072 Objecten macht das ein Mehrverbrauch von 524288 Bytes also 512 Kb..
Und das ist bei den eh schon 19 Gb wohl zu vernachlässigen
ok...ich mein ich hab da was gelesen das " = Class" und " = Class(TObject)" unterschiedlich gehandhabt werden. von daher könntest du recht haben.

Was ich aber meinte ist:

Delphi-Quellcode:
TYPE
   pfiguren = ^tfiguren;
   tfiguren = record
              x,y,f,s : integer;
             end;
   pframes = ^tframes;
   tframes = record
               a : integer;
               f : TList;
             end;
var
  frametab : TList;
oder (so würd ich das machen)

Delphi-Quellcode:
TYPE
   pfiguren = ^tfiguren;
   tfiguren = record
              x,y,f,s : integer;
             end;
   pframes = ^tframes;

   tframes = Class
   private
      pa : integer;
      pf : TList;

      procedure ClearAll;

   public
       :
       function Add(x,y,f,s:integer):integer;
       procedure Del(index:integer);

       property f[index:integer]:TFiguren read GetF write SetF;
   published
       property a : integer read pa write pa;
   end;
var
  frametab : TObjectlist;
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat