AGB  ·  Datenschutz  ·  Impressum  







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

Objektliste sprengt RAM (32-bit)

Ein Thema von Jens01 · begonnen am 12. Jul 2016 · letzter Beitrag vom 18. Jul 2016
Antwort Antwort
Seite 1 von 3  1 23      
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#1

Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:14
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.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:17
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?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:25
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#4

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:31
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?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:32
Hey,

sicher das es keine (heftigen) Leaks gibt?

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#6

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:37
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#7

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:39
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.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:43
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#9

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:45
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 ,..);
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 (12. Jul 2016 um 16:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Objektliste sprengt RAM (32-bit)

  Alt 12. Jul 2016, 16:50
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

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:53 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