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
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 09:10
Ist das Problem noch offen?
Genauer als der ProcessMonitor dürfte es sein, den Speicherverbrauch direkt in deinem Code zu messe. Wir haben da:
Delphi-Quellcode:
function GetApplicationMemory(): Int64;
var
  memoryState: TMemoryManagerState;
  blockState : TSmallBlockTypeState;
begin
  GetMemoryManagerState(memoryState);
  with memoryState do begin
    Result := TotalAllocatedMediumBlockSize + TotalAllocatedLargeBlockSize;
    for blockState in SmallBlockTypeStates do
      Inc(Result, blockState.AllocatedBlockCount * blockState.UseableBlockSize);
  end;
end;
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
674 Beiträge
 
#2

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 14:07
Zitat:
Ist das Problem noch offen?
Ja, ich muss aber erst noch ein Testprogramm erstellen. Das kann noch ein paar Tage dauern.
Dein GetApplicationMemory kann ich aber sehr gut gebrauchen. Sowas habe ich nämlich dafür noch gesucht. Danke!
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 (15. Jul 2016 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.733 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 20:14
Ein uebliches Problem ist das Vergroessern einer Liste: Sie wird immer um 25% der bisherigen Groesse vergroessert:

Delphi-Quellcode:
procedure TList.Grow;
var
  Delta: Integer;
begin
  if FCapacity > 64 then
    Delta := FCapacity div 4
  else
    if FCapacity > 8 then
      Delta := 16
    else
      Delta := 4;
  SetCapacity(FCapacity + Delta);
end;
Und in SetCapacity wird dann ReallocMem aufgerufen, was ggf. Speicher fuer eine neue Liste anfordert und dann die alten Eintraege kopiert. Das kann dann bei einer grossen Liste schnell zu Problemen fuehren.

Ach ja: MaxListSize ist MaxInt div 16

also ca. 2.000.000.000 / 16 = ca. 125.000.000

Nicht zu vergessen: Auch die Objekte selbst benoetigen Speicher und sorgen dafuer, dass er fragmentiert.

twm
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.733 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 20:19
Ach ja, noch was: Wenn es bei den Strings viele Duplikate gibt, lohnt es sich evtl. diese zusammenzufuegen:

https://en.wikipedia.org/wiki/String_interning

https://sourceforge.net/p/dzlib/code...StringPool.pas

Das kann den Speicherverbrauch drastisch reduzieren.

ShortString bringt uebrigens keinen Vorteil gegenueber den standard Strings, sie verbrauchen immer 256 Bytes.

twm
Thomas Mueller
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
674 Beiträge
 
#5

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 22:47
Das mit dem Grow is es nicht. Ich hatte schon versucht das runter zu setzen.
Zitat:
Ach ja, noch was: Wenn es bei den Strings viele Duplikate gibt, lohnt es sich evtl. diese zusammenzufuegen:
Ich speichere ja eigentlich keine Strings. Strings gehören zu den Selektoren.
Ich speichere Werte mit TAnyValue eine Art TValue. Das Ding habe ich gerade im Verdacht.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
674 Beiträge
 
#6

AW: Objektliste sprengt RAM (32-bit)

  Alt 15. Jul 2016, 22:52
Zitat:
Nicht zu vergessen: Auch die Objekte selbst benoetigen Speicher und sorgen dafuer, dass er fragmentiert.
Ja genau. Deswegen habe ich eigentlich gefragt, ob das an dem Objekt liegen kann. Kann so eine Fragmentierung so viel den Speicher aufblähen, wenn die Daten selbst eigentlich nur eine sehr kleine Größe haben?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Jens01

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

AW: Objektliste sprengt RAM (32-bit)

  Alt 18. Jul 2016, 16:53
Soo..
Ich habe das jetzt noch mal getestet. Es scheint wirklich an den Strings zu liegen. 3 Stück habe ich davon, kann aber nur ein String durch einen Integer ersetzen. Dies TAnyValue ist unschuldig!

Das Objekt durch ein Record zu ersetzen, bringt ca 20% an Speichereinsparung. Beim Durchsuchen der Liste wird dann aber mehr als das Doppelte an Zeit benötigt.

Ich glaube, ich muss meine Architektur noch mal überdenken....
Oder auf 64-Bit umstellen und Ram kaufen.
Wahrscheinlich beides.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  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 21:28 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