AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur zu langsam, Optimierung nötig

Ein Thema von carknue · begonnen am 8. Mär 2007 · letzter Beitrag vom 18. Mär 2007
Antwort Antwort
Seite 1 von 3  1 23      
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#1

Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 20:44
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;
  Mit Zitat antworten Zitat
8. Mär 2007, 20:48
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 20:48
wenn wir etwas optimieren sollen musst du uns auch alles geben was optimierbar ist (auch GetPosNumX)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#4

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 21:52
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.
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 21:57
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.
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 22:01
Zitat von SirThornberry:
wenn wir etwas optimieren sollen musst du uns auch alles geben was optimierbar ist (auch GetPosNumX)
Zitat von carknue:
Ok, sorry aber ich dachte GetPosNumX wäre hier bekannt, da es von hier kommt.

So, SirThornberry, nun mach deinen eigenen Code auch mal etwas schneller bitte.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 22:22
uj, das ist schon so lange her 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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 23:04
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
  Mit Zitat antworten Zitat
carknue

Registriert seit: 26. Mai 2005
37 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Prozedur zu langsam, Optimierung nötig

  Alt 8. Mär 2007, 23:23
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Prozedur zu langsam, Optimierung nötig

  Alt 9. Mär 2007, 00:28
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
Angehängte Dateien
Dateityp: pas unit_sparsematrix_202.pas (3,7 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 03: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