AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mein Programm ist Arbeitsspeicher hungrig..
Thema durchsuchen
Ansicht
Themen-Optionen

Mein Programm ist Arbeitsspeicher hungrig..

Ein Thema von Cubysoft · begonnen am 18. Mai 2015 · letzter Beitrag vom 20. Mai 2015
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#21

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 13:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 13:45
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.


PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#23

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 14:06
PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.
emm wie? Unter welchen Bedingungen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#24

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 14:17
http://www.delphipraxis.net/184578-d...ml#post1299464

Einen Hotfix gab es inzwischen zwar, aber da wurde diesbezüglich nichts behoben.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#25

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 14:19
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#26

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 18:06
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
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#27

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 21:40
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.

Geändert von idefix2 (19. Mai 2015 um 21:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#28

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 20. Mai 2015, 05:53
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.
$2B or not $2B

Geändert von himitsu (20. Mai 2015 um 05:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#29

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 20. Mai 2015, 09:46
Wie war das mit gleichen Strings?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#30

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 20. Mai 2015, 10:14
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.
$2B or not $2B

Geändert von himitsu (20. Mai 2015 um 10:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 14:56 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