Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur zu langsam, Optimierung nötig (https://www.delphipraxis.net/88009-prozedur-zu-langsam-optimierung-noetig.html)

carknue 8. Mär 2007 20:44


Prozedur zu langsam, Optimierung nötig
 
Hallo,

ich habe eine kleine Prozedur geschrieben, die aus einer GPS Text Datei für jede Koordinate den besten Messwert raussuchen soll und diesen in eine neue Datei schreiben soll. Meine angehängte Prozedur macht das auch ganz gut. Das Problem ist nur, dass diese Messdateien sehr groß sind, ca 100.000 Zeilen bei 4 Mb Größe. Mit solch großen Dateien dauert diese Prozedur mehrere Stunden auf durchaus aktueller Hardware. Meine Frage ist jetzt, wie könnte man diese Prozedur optimieren. Gleiche Koordinaten kommen in dieser Datei öfters vor, optimal wäre es, wenn im neuen File jede Koordinate wirklich nur 1 Mal stehen würde, mit natürlich dem besten Wert. Mit meiner Prozedur steht da diese Koordinate genau so oft, wie vorher drin aber wenigstens immer mit dem besten Wert. Hat jemand vielleicht ein e Idee?


Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  f,g,h: Textfile;
  zeile,rxl: string;
  suchkoor: string;
  Zeileg: string;
  Koor: Array[0..1000] of string;
  i,l,maxi: Integer;
  maxrxl: Integer;


begin
 Screen.Cursor:=crHourglass;
 DecimalSeparator:='.';
 AssignFile(f,OpenDialog1.FileName);
 Reset(f);
 readln(f,Zeile);
 AssignFile(g,OpenDialog1.FileName);
 Reset(g);
 readln(g,Zeileg);
 AssignFile(h,'C:\Best_Server.txt');
 rewrite(h);
 Writeln(h,'lon'+chr(9)+'lat'+chr(9)+'RXL'+chr(9)+'CID'+chr(9)+'BCCH');
 repeat
   readln(f,Zeile);
   suchkoor:=copy(Zeile,1,GetPosNumX(chr(9),Zeile,2)-1);
   reset(g);
   readln(g,Zeileg);
   i:=0;
   repeat
     readln(g,Zeileg);
     if pos(suchkoor,Zeileg)>0 then
     begin
       koor[i]:=Zeileg;
       i:=i+1;
     end;

   until EOF(g);
   maxrxl:=-200;
   maxi:=0;
   if i=1 then Writeln(h,koor[0])
   else
   begin
     for l := 0 to i - 1 do
     begin
       rxl:=copy(koor[l],GetPosNumX(chr(9),koor[l],2)+1,GetPosNumX(chr(9),koor[l],3)-GetPosNumX(chr(9),koor[l],2)-1);
       label11.Caption:=koor[l];
       label12.Caption:=inttostr(i);
       update;
       if strtoint(rxl)>maxrxl then
       begin
        maxrxl:=strtoint(rxl);
        maxi:=l;
       end;
     end;
     Writeln(h,koor[maxi]);

   end;

 until EOF(f);
 closefile(f);
 closefile(g);
 closefile(h);
 Screen.Cursor:=crDefault;
end;

DP-Maintenance 8. Mär 2007 20:48

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

SirThornberry 8. Mär 2007 20:48

Re: Prozedur zu langsam, Optimierung nötig
 
wenn wir etwas optimieren sollen musst du uns auch alles geben was optimierbar ist (auch GetPosNumX)

Thanatos81 8. Mär 2007 21:52

Re: Prozedur zu langsam, Optimierung nötig
 
Wenn ich das richtig sehe, werden f und g die selbe Datei zugewiesen, dann durchläufst du f von Anfang bis Ende und in jedem Durchlauf(f) durchläufst du g komplett.

Bei jedem Durchlauf(f) wird g erneut geöffnet. Und jedes readLn liest von der Platte. Das kostet natürlich unheimlich Zeit.

Ich würde statt dessen folgender Herangehensweise versuchen.
  • Datei öffnen
  • Daten in ein passendes Record schreiben
  • Record per Hier im Forum suchenQuicksort nach Koordinaten sortieren
  • Eine Variable "letzteKoords" und ein Array "besterWert/Koord" einführen
  • Record durchlaufen und prüfen ob letzteKoords = aktuelle Koords, falls ja, schauen ob aktueller Wert besser, dann im Array speichern
  • Zum Schluss alles in eine neue Datei speichern.

GetPosNumX wäre aber wirklich hilfreich.

carknue 8. Mär 2007 21:57

Re: Prozedur zu langsam, Optimierung nötig
 
Ok, sorry aber ich dachte GetPosNumX wäre hier bekannt, da es von hier kommt.

Noch zur Erklärung, jede Zeile ist ein Messwert. Zuerst die x und y Koordinate, und dann der rxl Messwert. Alles mit Tabs chr(9) getrennt.

IngoD7 8. Mär 2007 22:01

Re: Prozedur zu langsam, Optimierung nötig
 
Zitat:

Zitat von SirThornberry
wenn wir etwas optimieren sollen musst du uns auch alles geben was optimierbar ist (auch GetPosNumX)

Zitat:

Zitat von carknue
Ok, sorry aber ich dachte GetPosNumX wäre hier bekannt, da es von hier kommt.

:mrgreen: :mrgreen:
So, SirThornberry, nun mach deinen eigenen Code auch mal etwas schneller bitte. :wink:

SirThornberry 8. Mär 2007 22:22

Re: Prozedur zu langsam, Optimierung nötig
 
uj, das ist schon so lange her :oops: Aber wie bereits erwähnt sollte das langsamste sein das hier mit dateien gearbeitet wird. Das schnellste wäre wenn du die Datei in einem rutsch in den Arbeitsspeicher liest (und nicht in vielen kleinen stücken immer wieder liest) und dann kannst du mit der Datei im Arbeitsspeicher um ein vielfaches schneller arbeiten.

Hawkeye219 8. Mär 2007 23:04

Re: Prozedur zu langsam, Optimierung nötig
 
Hallo,

interessant wären noch die Art der Werte (integer, real) und der Wertebereich (falls möglich). Vielleicht kannst du auch ein paar Beispielzeilen aus der Eingabedatei zeigen.

Gruß Hawkeye

carknue 8. Mär 2007 23:23

Re: Prozedur zu langsam, Optimierung nötig
 
Klar, hier ein Beispiel, die erste Zeile ist die Überschrift, die in jeder Datei enthalten ist.

lon lat RXL CID BCCH
6.612051 51.329779 -70 00276 963
6.6122 51.3297 -67 00276 963
6.612051 51.329779 -61 00275 973


Wie gesagt, die Werte sind mit Tabs getrennt. rxl sind immer negative integer von -120 bis -40. lon und lat sind Fließkommazahlen mit unterschiedlich Nachkommastellen.

Den Vorschlag mit Nach Koordinate sortieren, habe ich noch nicht ganz verstanden. Eine Koordinate besteht doch aus zwei Werten, lon und lat. Nach welchem soll ich dann sortieren?

Und wichtig wäre, dass keine doppelten Koordinaten mehr in der Ausgangs Datei sind, sondern nur einmal mit dem größten Wert von rxl

Gruß
Carsten

Hawkeye219 9. Mär 2007 00:28

Re: Prozedur zu langsam, Optimierung nötig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, im Anhang findest du einen Vorschlag zur Lösung deines Problems mit Hilfe einer sparse matrix. Die Koordinaten dienen dabei als Index, jedes Matrixelement speichert den RXL-Wert und den Zeilenrest. Ich habe einige wenige Stellen kommentiert, der Rest ist (hoffentlich) selbsterklärend. Die Unit gewinnt sicher keinen Schönheitspreis und ist möglicherweise auch nicht fehlerfrei. Betrachte sie einfach als Anregung.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr.
Seite 1 von 3  1 23      

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