Registriert seit: 26. Mai 2005
37 Beiträge
Turbo Delphi für Win32
|
Prozedur zu langsam, Optimierung nötig
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;
|