Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Objektliste sprengt RAM (32-bit) (https://www.delphipraxis.net/189714-objektliste-sprengt-ram-32-bit.html)

Jens01 12. Jul 2016 16:14

Objektliste sprengt RAM (32-bit)
 
Hallo...
ich habe Probleme mit einer TObjectlist, in der ich Ergebniswerte mit Selektoren abspeichere. In der Liste können schon mal mehrere zehntausend Werte auflaufen. Ab einer bestimmten Menge gibt es ein "Out of Memory"-Fehler und das Programm stürzt ab.
Was für mich aber unverständlich ist, wenn ich dieselben Daten in ein Stream packe und auf der Festplatte abspeichere, sind da nur wenige Kilobyte zu finden. Wieso bläht sich das so im RAM auf?
Gibt es Möglichkeiten, das zu reduzieren?

Meine prinzipielle Programmstruktur:
Delphi-Quellcode:
  TWert = class
  private
    FWert    : Double;
    FSelektor1: Integer;
    FSelektor2: string;
  public
    constructor Create(AWert: Double; ASelektor1: Integer; ASelektor2: string);
    property Wert: Double read FWert write FWert;
    property Selektor1: Integer read FSelektor1 write FSelektor1;
    property Selektor2: string read FSelektor2 write FSelektor2;
  end;

  TWerteliste = class(TObjectList<TWert>)
  private
  public
    procedure Add(AWert: Double; ASelektor1: Integer; ASelektor2: string);
    function FindWert(ASelektor1: Integer; ASelektor2: string): Double;
  end;
P.S.:
Um Fragen vorzubeugen: Ich nutze keine Datenbank, weil für mein Projekt schon die schnelleren Memorydatenbanken zu langsam sind.

Daniel 12. Jul 2016 16:17

AW: Objektliste sprengt RAM (32-bit)
 
hm.
Der Speicherverbrauch hängt auch ein wenig von der Länge Deiner Strings ab, doch wenn die nicht "zu lang" sind, sollten hunderttausende dieser Einträge kein Problem sein.
Kannst Du das Problem auf ein Minimal-Beispiel mit Testdaten reduzieren?

Zacherl 12. Jul 2016 16:25

AW: Objektliste sprengt RAM (32-bit)
 
Zitat:

Zitat von Jens01 (Beitrag 1342491)
wenn ich dieselben Daten in ein Stream packe und auf der Festplatte abspeichere, sind da nur wenige Kilobyte zu finden

Das liegt daran, dass die Strings nur als "pointer sized" (unter 32 Bit 4-Byte) Referenzen im Stream gespeichert werden, wenn du das komplette Objekt da reinschreibst.

Jens01 12. Jul 2016 16:31

AW: Objektliste sprengt RAM (32-bit)
 
Also die Strings haben eine ungefähre Länge von 10 bis 30 Zeichen. Allerdings sind da ab-und-zu auch griechische Buchstaben drin.
Ich habe auch schon andere Typen versucht, also Shortstring, ShortInt usw. Hat alles nichts gebracht.
Zitat:

Kannst Du das Problem auf ein Minimal-Beispiel mit Testdaten reduzieren?
Wie meinst Du das? Soll ich das posten?

milos 12. Jul 2016 16:32

AW: Objektliste sprengt RAM (32-bit)
 
Hey,

sicher das es keine (heftigen) Leaks gibt?

Freundliche Grüsse

Uwe Raabe 12. Jul 2016 16:37

AW: Objektliste sprengt RAM (32-bit)
 
Zitat:

Zitat von Jens01 (Beitrag 1342495)
Also die Strings haben eine ungefähre Länge von 10 bis 30 Zeichen.

...

Wie meinst Du das? Soll ich das posten?

Ja, schon. Deine Klasse hat demnach eine Nutzgröße von ca. 60 Byte. Da sollten selbst Millionen Instanzen keine allzu großen Probleme bereiten. Daher ist das Problem offenbar an anderer Stelle zu suchen. An der Klassendefinition und der von dir avisierten Anzahl liegt es vermutlich nicht.

Jens01 12. Jul 2016 16:39

AW: Objektliste sprengt RAM (32-bit)
 
Zitat:

Das liegt daran, dass die Strings nur als "pointer sized" (unter 32 Bit 4-Byte) Referenzen im Stream gespeichert werden, wenn du das komplette Objekt da reinschreibst.
Ich hoffe, dass ich Dich richtig verstehe, aber ich baue einen Stream mit den einzelnen Werten und Sektoren zusammen. Ich werfe nicht das Objekt so in den Stream. Es läßt sich auch alles sauber vom Stream in die Liste zurückschreiben.

mkinzler 12. Jul 2016 16:43

AW: Objektliste sprengt RAM (32-bit)
 
Zitat:

Ich werfe nicht das Objekt so in den Stream. Es läßt sich auch alles sauber vom Stream in die Liste zurückschreiben.
Aber auch in diesem Fall befinden sich nicht alle Strings auf einmal im Speicher.

Jens01 12. Jul 2016 16:45

AW: Objektliste sprengt RAM (32-bit)
 
Delphi-Quellcode:
    FName           : string;
    FHerkunft       : string;
    FLF             : Integer;
    FIndx           : Integer;
    FValue          : TAnyValue;
    FKategorie      : TKategorie;
    FKombiName      : string;
    FKombiGruppe    : TKombiGruppe;
    FKombiRechenIndex: Integer;
So das ist meine reale Liste. (Das oben war nur das Prinzip)
Was mir gerade ins Auge springt, ist dies TAnyValue, was ich nutze.
Kann das das Problem sein? Ich hoffe TAnyValue ist bekannt.

P.S.: TKategorie, TKombiGruppe sind nur so kleine Typen : TKategorie = (eins, zwei, drei ,..);

milos 12. Jul 2016 16:50

AW: Objektliste sprengt RAM (32-bit)
 
Hi,

wie schon erwähnt... Sicher das es keine Memory Leaks sind? Glaube nicht dass das von den ganzen strings kommt...
schau doch mal mit FastMM oder Delphi-Referenz durchsuchenReportMemoryLeaksOnShutdown ( := true; ) ob es da welche gibt.

Falls ja musst du halt ein wenig aufräumen :P

Freundliche Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf