Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu Strings (https://www.delphipraxis.net/98877-frage-zu-strings.html)

maximus Caesar 3. Sep 2007 15:25


Frage zu Strings
 
Hallo!
Wenn ich einen String verwende, wieviel Speicher benötigt der?
Oder ist er Dynamisch?
Wenn ja, wieviel Speicher benötigt er mindestens?
Ich möchte Reale zahlen speichern, also mit Nachkommastellen, aber dafür so wenig speicher wie möglich brauchen. Real benötigt halt 48b und das ist mir zuviel
(es handelt sich um bis zu 5mio Speichersätze)

Klaus01 3. Sep 2007 15:30

Re: Frage zu Strings
 
Hallo,

ein String benötigt pro Zeichen 1 Byte und ein Byte für die Längenangabe.
Also mindestens 2 Byte maximal ....

Aber Deine Datenmenge, so groß ist die doch nicht.

48 Byte * 5 000 000 /1024 = 234375 KByte

Grüße
Klaus

maximus Caesar 3. Sep 2007 15:33

Re: Frage zu Strings
 
Die Datenmenge geht schon, aber bei der Verarbeitung werden nochmals einige Daten erzeugt, was dazu führen kann das die Datenmenge die 1GB grenze schnell überschreitet....

Danke für die schnelle Antwort!!!

RavenIV 3. Sep 2007 15:36

Re: Frage zu Strings
 
Zitat:

Zitat von Delphi-Hilfe
ShortString 255 Zeichen 2 bis 256 Byte
AnsiString ~2^31 Zeichen 4 Byte bis 2 GB


Gruber_Hans_12345 3. Sep 2007 15:50

Re: Frage zu Strings
 
ein real braucht doch keine 48 Byte sondern 48 Bit = 6 Byte

und ein String (zumindest ein "normaler" Delphi string) braucht noch mehr zb.: wird da pro String ein 4Byte Counter mitgeführt (und die Länge ist auch sicher eher 4 Byte groß)

Robert Marquardt 3. Sep 2007 15:52

Re: Frage zu Strings
 
Zitat:

Zitat von maximus Caesar
Ich möchte Reale zahlen speichern, also mit Nachkommastellen, aber dafür so wenig speicher wie möglich brauchen. Real benötigt halt 48b und das ist mir zuviel (es handelt sich um bis zu 5mio Speichersätze)

Wenn du die Zahlen im Dezimalsystem im String ablegen willst, dann ist das gefaehrlich. Es ergeben sich naemlich immer Ungenauigkeiten beim Umwandeln.
Was sind schon ein paar Megabyte. Wenn du sie brauchst, dann brauchst du sie halt. Da jeder String einzeln alloziiert ist, duerfte der reale Speicherverbrauch mit mindestens 5 Byte nicht wirklich besser sein.

KPBecker 3. Sep 2007 15:54

Re: Frage zu Strings
 
Aber:

Wenn du real-Größen zum Speichern und zum Lesen immer wieder in Zahlen (Ziffern) umwandelst, kann das bei häufigem R/W und großen Datenmengen empfindlich in die Rechenzeit gehen !

Außerdem braucht eine real-Größe nur 4-6-8 Byte. Da bist du mit der Zifferdarstellung schnell drüberhinaus.

Klaus-Peter

maximus Caesar 3. Sep 2007 15:55

Re: Frage zu Strings
 
Die Zahlen haben maximal 3 Vorkomma und 2 Nachkomma Stellen...
Ich dachte Real benötigt 48b?

mkinzler 3. Sep 2007 15:57

Re: Frage zu Strings
 
Dann wäre der String ja schon größer.

maximus Caesar 3. Sep 2007 15:59

Re: Frage zu Strings
 
Ups, Stimmt ja....

shmia 3. Sep 2007 16:10

Re: Frage zu Strings
 
Inzwischen sollte klar sein, dass deine Messwerte als Strings immer mehr Platz benötigen, als ein binärer Datentyp wie Single, Real oder Double.
Jetzt kommt es noch auf den Wertebereich und die Genauigkeit an.
Man könnte mit einem Festkommaformat viel an Platz und Gewschwindigkeit verbessern.
Angenommen, du bräuchtest nur eine Nachkommastelle. Das entspräche (aufgerundet )4 Bit.
Ein Integer mit 27 Bit+(1Bit Vorzeichen) für die Vorkomma und 4 Bit für die Nachkommastellen wäre dann sehr effizient.

RavenIV 3. Sep 2007 16:11

Re: Frage zu Strings
 
Warum nimmst Du denn dann keinen Single?
Müsste doch reichen für Deine Zwecke...

Code:
Typ     Bereich                 Signifikante Stellen Größe in Byte  
Real48   -2,9 x 10^39 .. 1,7 x 10^38         11-12          6   
Single  -1,5 x 10^45 .. 3,4 x 10^38         7-8            4   
Double  -5,0 x 10^324 .. 1,7 x 10^308       15-16          8   
Extended  -3,6 x 10^4951 .. 1,1 x 10^4932   10-20         10   
Comp    -2^63+1 .. 2^63 1                   10-20          8

Martin K 3. Sep 2007 16:44

Re: Frage zu Strings
 
Zitat:

Zitat von maximus Caesar
Die Zahlen haben maximal 3 Vorkomma und 2 Nachkomma Stellen...

Dann reicht doch ein Integer vollkommen, die beiden hintersten Stellen legst du dann einfach als Nachkommastellen fest.
Zum Umwandeln in Real kannst du dir dann etwa solche Funktionen basteln:
Delphi-Quellcode:
function RealToMeinFormat(const Value: Real): Integer;
begin
  Result := Trunc(Value * 100);
end;

function MeinFormatToReal(const Value: Integer): Real;
begin
  Result := (Value div 100) + (Value mod 100) / 100;
end;
Die Speicherung deiner Datensätze als Integer dürfte ziemlich effizient sein, ein Integer benötigt nur 4 Byte.

//Nachtrag:
@RavenIV: Single ist ziemlich ungenau bei einer festen Anzahl an Nachkommastellen.
Er hat 2 Nachkommastellen bei seinen Daten und das wird bei Single schnell ungenau.
Beispiel: 1,73 wird bei Single zu 1,73000001907349.
Deswegen würde ich ein Integer bevorzugen, hier kann es keine Rundengsfehler geben und benötigt genauso viel Speicherplatz wie ein Single.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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