Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi double Werte aus Strings lesen (https://www.delphipraxis.net/18770-double-werte-aus-strings-lesen.html)

hukopush 24. Mär 2004 14:06


double Werte aus Strings lesen
 
Hallo Forum,
ich habe schon des öfteren in euren Beiträgen rumgestöbert.
Da ich jetzt ein problem habe, bei dem ich selber keine Idee mehr habe, wende ich mich Hilfesuchend an euch!!

Mei Problem ist eigentlich nur ein Geschwindigkeitsproblem und zwar lese ich aus einem Ansistring der folgendermassen aufgebaut ist

Delphi-Quellcode:
1020,686            3566,704            3669,117            3520,530             541,853            1544,589            1789,372            1211,255               0,000               0,000               0,000               0,000               0,000              21,045              19,881              20,764              20,306              20,995              20,318
usw.


die Werte folgendermasen in ein Array ein.



Delphi-Quellcode:
var
  Hilf1 : Ansisring;
  aktPos : Longint;
for i := 1 to AktMesszahl - 1 do
begin
  while hilf1[aktpos] = ' ' do // alle Leerzeichen rausfiltern
    inc(aktpos);

  Hilf2 := '';
  while hilf1[aktpos] <> ' ' do
  begin
    Hilf2 := Hilf2 + hilf1[aktpos];
    inc(aktPos);
  end; (* while *)
  DatenArray[AktHeaderzahl-1,aktDatensatz-1,i] := StrToFloat(hilf2);
end; (* for *)

Da meine Dateien bis zu ca. 1000000 Zeilen obigen Typs(oder mehr Daten) bestehen, kann dies eine sehr Zeitaufwendige Procedure sein. (10000 Zeilen benötigen ca 22 Sekunden auf einem P4 1,8 Ghz)

Hat einer eine Idee wie ich dieses einlesen beschleunigen kann?

Bin für jede Anregung dankbar
Gruß
Heiko

shmia 24. Mär 2004 14:38

Re: double Werte aus Strings lesen
 
Der Flaschenhals ist die Zeile
Hilf2 := Hilf2 + hilf1[aktpos];
Jedesmal wird Hilf2 um ein Zeichen verlängert, dabei wird dynamisch
neuer Speicher angefordert, der bisherige String an den neuen Platz kopiert,
das eine Zeichen angehängt und der alte Speicher freigemacht.
Das braucht Zeit !!

Delphi-Quellcode:
var
  Hilf1 : Ansisring;
  aktPos : Longint;
   
for i := 1 to AktMesszahl - 1 do
begin
  while hilf1[aktpos] = ' ' do // alle Leerzeichen rausfiltern
    inc(aktpos);

  // die nächsten 15 Zeichen (oder weniger)
  // als Float lesen
  DatenArray[AktHeaderzahl-1,aktDatensatz-1,i] := StrToFloat(Copy(hilf1, 1, 15));

  // bis zu nächsten Leerzeichen überlesen
  while hilf1[aktpos] <> ' ' do
    inc(aktPos);
end; (* for *)

hukopush 24. Mär 2004 15:09

Re: double Werte aus Strings lesen
 
Vielen Dank für den Tip, aber ich glaube der richtige durchbruch war es noch nicht. Die Lesezeit verkürzte sich bei meinem testcase von 22 auf 19,5 sekunden.
Trotzdem bedanke ich mich bei dir, denn ich hoffe, das noch 10 weitere solcher Beiträge kommen,und ich somit auf 10 sekunden komme!! ;)

heiko


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