![]() |
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
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: Prozedur zu langsam, Optimierung nötig
wenn wir etwas optimieren sollen musst du uns auch alles geben was optimierbar ist (auch GetPosNumX)
|
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.
GetPosNumX wäre aber wirklich hilfreich. |
Re: Prozedur zu langsam, Optimierung nötig
Ok, sorry aber ich dachte
![]() 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. |
Re: Prozedur zu langsam, Optimierung nötig
Zitat:
Zitat:
So, SirThornberry, nun mach deinen eigenen Code auch mal etwas schneller bitte. :wink: |
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.
|
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 |
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 |
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. |
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