![]() |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
Delphi-Quellcode:
type
A = packed Record // Sizeof = 5 S : String; B1 : byte; End; B = Record // Sizeof = 8 S : String; B1 : byte; End; |
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. |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
|
AW: Mein Programm ist Arbeitsspeicher hungrig..
![]() Einen Hotfix gab es inzwischen zwar, aber da wurde diesbezüglich nichts behoben. |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Zitat:
|
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 ;-) |
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. |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Delphi-Quellcode:
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:
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; |
AW: Mein Programm ist Arbeitsspeicher hungrig..
Wie war das mit gleichen Strings?
|
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:
Ein CharArray mit 5 Bytes/AnsiChars wird insgesamt aber vermutlich dennoch weniger Speicher brauchen, als due zusammengefassten LongStrings.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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 by Thomas Breitkreuz