Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mein Programm ist Arbeitsspeicher hungrig.. (https://www.delphipraxis.net/185142-mein-programm-ist-arbeitsspeicher-hungrig.html)

Mavarik 19. Mai 2015 13:25

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Zitat:

Zitat von himitsu (Beitrag 1302139)
Bytes sind nie Aligned, bzw. immer an 1 ausgerichtet, egal ob mit oder ohne Packed.

Schon aber

Delphi-Quellcode:
type
  A = packed Record // Sizeof = 5
        S : String;
        B1 : byte;
      End;
  B = Record      // Sizeof = 8
        S : String;
        B1 : byte;
      End;

himitsu 19. Mai 2015 13:45

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Ja, aber in seinem Record gibt es "zufällig" genau ein Vielfaches von 4, an Bytes/Booleans.

Und wie gesagt, die Liste mit allen Records selber ist grade mal 0,7 MB groß winzig.
Wobei die gesamten 100 MB nun eigentlich auch nicht wirklich soooooo viel sind. :angle:


PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.

Mavarik 19. Mai 2015 14:06

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Zitat:

Zitat von himitsu (Beitrag 1302153)
PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.

emm wie? Unter welchen Bedingungen?

himitsu 19. Mai 2015 14:17

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
http://www.delphipraxis.net/184578-d...ml#post1299464

Einen Hotfix gab es inzwischen zwar, aber da wurde diesbezüglich nichts behoben.

Sir Rufo 19. Mai 2015 14:19

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Zitat:

Zitat von himitsu (Beitrag 1302156)
http://www.delphipraxis.net/184578-d...ml#post1299464

Einen Hotfix gab es inzwischen zwar, aber da wurde diesbezüglich nichts behoben.

Wer arbeitet denn auch schon mit Listen und Records ... das sind doch nur ein paar Unverbesserliche und das wird denen eh noch ausgetrieben ... (oder irgendwie so in der Art scheint das zu laufen)

Der schöne Günther 19. Mai 2015 18:06

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Mavarik ist jetzt ein super Beispiel, finde ich: Woher hätte er das eigentlich wissen sollen?

Das weiß man doch nur wenn man den halben Tag in der Delphi-Praxis oder StackOverflow hängt. Oder Marco Cantus Google Plus-Beiträge belauert. Aber sonst? Außer einem Google+-Post von Marco habe ich von Embarcadero noch überhaupt nichts in der Richtung gesehen.

Oder wenn man sich fragt warum sich die Anwendung seit der testweisen Migration auf XE8 so komisch verhält. Dann weiß man es nach einer halben Stunde vielleicht auch ;-)

idefix2 19. Mai 2015 21:40

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Von den Speicherlecks abgesehen:
Wenn du 12 booleans aus jedem Record platzsparend speichern willst, dann machst du einen Aufzähltyp für die zwölf Variablen und speicherst die 12 boolean Werte in einer Variable von Typ set of Aufzähltyp.
Dann brauchen die 12 Booleans zusammen nur zwei Bytes.
Und den 5 byte langen String kannst du in einem array[1..5] of AnsiChar stecken (mit Null-Bytes auffüllen, wenn der string kürzer ist) - ausser natürlich, die Strings können unicode Zeichen beinhalten, die nicht in 8 bit darstellbar sind.
Dann braucht jeder deiner 41000 Einträge genau 7 bytes komplett inklusive der Strings.
Wenn du die Variablen als properties der Klasse deklarierst und entsprechende getter und setter schreibst, ist das völlig transparent, nur natürlich zur Laufzeit etwas langsamer als eine native Speicherung der Daten.

himitsu 20. Mai 2015 05:53

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Delphi-Quellcode:
record
  S: String[5]; // oder Array of Char/AnsiChar/WideChar
  W: Word;
  procedure Setter(Value: Boolean); // if Value then W := W or (1 shl Index) else ...
  function Getter: Boolean; // Result := W and (1 shl Index) <> 0;
  property W1: Boolean index 0 read Getter write Setter;
  property W2: Boolean index 1 read Getter write Setter;
  property W3: Boolean index 2 read Getter write Setter;
  ...
end;
Aber vorher sollten sowieso die Speicherlecks behoben werden, bevor man veruscht die läppischen 2 MB auf 280 KB, bzw. 320 KB mit ShortString oder 480 KB mit WideChar zu schrumpfen. :roll:

Mavarik 20. Mai 2015 09:46

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Wie war das mit gleichen Strings?

himitsu 20. Mai 2015 10:14

AW: Mein Programm ist Arbeitsspeicher hungrig..
 
Bei einem ShortString/CharArray ist das egal, da eh jeder seinen eigenen Speicher hat.

Ansonsten kann man gern sonstwie durch das Array laufen und das zusammenfassen (also nur bei LongStrings)
Delphi-Quellcode:
for i := Low(A) to High(A) - 1 do
  for j := i + 1 to High(A) do
    if A[i].S = A[j].S then
      A[i].S := A[j].S;
Ein CharArray mit 5 Bytes/AnsiChars wird insgesamt aber vermutlich dennoch weniger Speicher brauchen, als due zusammengefassten LongStrings.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 Uhr.
Seite 3 von 3     123   

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 by Thomas Breitkreuz