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
Seite 2 von 2     12   
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 09:52
Hallo,
ich werfe mal Memory Mapped files ins Rennen.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 10:21
New / Dispose...

Btw: Ist Euch aufgefallen, dass der TE nicht mehr geantwortet hat?

Das ist wieder so ein Thread der sich selber am Leben hält...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#13

AW: riesengroße Arrays > 2GB

  Alt 3. Jun 2017, 11:17
Btw: Ist Euch aufgefallen, dass der TE nicht mehr geantwortet hat?
51 Logins in 11 Jahren ... statistisch in spätestens 78 Tagen wird eine Antwort schon noch kommen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
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, 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
961 Beiträge
 
Delphi 6 Professional
 
#15

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
Ghostwalker

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

AW: riesengroße Arrays > 2GB

  Alt 4. Jun 2017, 03:23
Nö.

TFiguren ist ein Zeiger auf einen Record. D.h. ich hab pro Element ledigilich 4 Byte die am Stück benötigt werden (+ 16 Byte irgendwo im Speicher). Wie weiter oben schon erwähnt wurde, ist hier das entscheidende, das ein Array den Speicher am Stück brauchen.

d.h. das das Array (mit den 10000 Elementen) im 1. Fall 156 MB am Stück braucht, in meinem Fall 39 MB (Also bei TFiguren als Zeiger). Die 156 MB verteilen sich in kleine Häpchen über den Speicher (je nach dem wo der Speichermanager das grad hinpackt.)

Aber egal wie nu, wir dürften uns einig sein, das hier einfach viel zu viele Daten im Speicher gehalten werden (bzw. versucht wird das zu tun).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: riesengroße Arrays > 2GB

  Alt 6. Jun 2017, 15:07
Btw: Ist Euch aufgefallen, dass der TE nicht mehr geantwortet hat?
51 Logins in 11 Jahren ... statistisch in spätestens 78 Tagen wird eine Antwort schon noch kommen
Hm, ich überlege was ich fragen könnte ... und mich dann zurücklehnen und die Antworten genießen popcorn
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 14:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz