AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

riesengroße Arrays > 2GB

Ein Thema von juelin · begonnen am 2. Jun 2017 · letzter Beitrag vom 6. Jun 2017
Antwort Antwort
Ghostwalker

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

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 16: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
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#2

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 18:56
Das

f: array [1..9999] of tfiguren;

ebenfalls zu einer TList zu machen, ist auch OK, nur dann hättest Du gleich je TFiguren * 4 Byte mehr für die Pointer in der TList.
Entspricht dann: 10000 * 4 * 131072 = 4,8 Gb..

Und das währe dann wirklich wesendlich mehr

Es ging mir in meinem Vorschlag darum, die 19 Gb am Stück aufzuteilen und dazu genügt es schon aus tframes eine Klasse zu machen..

Denn für 159992 Bytes am Stück ist es einfacher Speicher zu bekommen, statt für 19 Gb.

Lt meinem Wissen ist
" = Class" und " = Class(TObject)" identisch, zu mindestens bei Delphi 6

Das " = Class" stellt nur eine verkürzte Schreibweise da.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz