Einzelnen Beitrag anzeigen

slang

Registriert seit: 23. Feb 2005
12 Beiträge
 
#1

Programm mit TFilestreams zu langsam

  Alt 10. Jan 2007, 12:31
Hallo!

Ich habe eine kleine Konsolenanwendung geschrieben, welche eine große Datei durchsuchen und bestimmte Zeichenfolgen ersetzen soll.
Erstmal soll die ASCII-Folge 139210 durch ASCII 32 ersetzt werden.
Danach sollen alle übriggebliebenen ASCII 13 durch ASCII 32 ersetzt werden.
Danach sollen alle übriggebliebenen ASCII 10 durch ASCII 1310 ersetzt werden.
Das Programm braucht leider für eine 16MB Datei schon ca. 5 Minuten.
Es soll aber für Dateien mit über 500MB (eventuell auch über 1GB) eingesetzt werden.
Kann mir jemand ein paar Tipps geben, wo ich was verbessern kann bzw. wo mein Programm ausgebremst wird?
Hier der komplette Quelltext:

Delphi-Quellcode:
program ersetze;

{$APPTYPE CONSOLE}

uses
  SysUtils,Classes;

var stream1: TFIleStream;
    stream2: TFileStream;
    Buf,Buf2,Buf3 : Byte;
    chSpace,chCR,chLF: char;
    a,b,c:integer;

begin
  a:=0;
  b:=0;
  c:=0;
  chSpace := #32;
  chCR := #13;
  chLF := #10;
  stream1 := TFileStream.Create('c:\test.unl', fmOpenRead);
  stream2 := TFileStream.Create('c:\test2.unl', fmCreate);
  try
    // Byteweise in Stream1 bis zum Dateiende lesen
    while stream1.Position < stream1.size do
     begin
      stream1.Read(Buf,sizeof(Buf));
      if Buf = 13 then // ASCII 13 gefunden -> nächstes Byte muss überprüft werden
       begin
        stream1.Read(Buf2,sizeof(Buf2));
        if Buf2 = 92 then // ASCII 1392 gefunden -> nächstes Byte muss überprüft werden
         begin
          stream1.Read(Buf3,sizeof(Buf3));
          if Buf3 = 10 then // ASCII 139210 gefunden
           begin // Statt ASCII 139210 wird ASCII 32 (Space) in die neue Datei geschrieben
            stream2.Write(chSpace,sizeof(chSpace));
            a := a + 1;
           end
          else // kein ASCII 10 an dritter Stelle -> ASCII 32 (Space) in neue Datei schreiben und 2 Bytes zurückspringen
           begin
            stream2.Write(chSpace,SizeOf(chSpace));
            stream1.Seek(-2,soFromCurrent);
            b := b + 1;
           end;
         end
        else // kein ASCII 92 an zweiter Stelle -> ASCII 32 (Space) in neue Datei schreiben und 1 Byte zurückspringen
         begin
          stream2.Write(chSpace,SizeOf(chSpace));
          stream1.Seek(-1,soFromCurrent);
          b := b + 1;
         end;
       end
      else if Buf = 10 then // Kein ASCII 13 gefunden -> Prüfen ob ASCII 10 gefunden wurde
       begin // ASCII 10 gefunden -> ASCII 1310 in neue Datei schreiben
        stream2.Write(chCR,SizeOf(chCR));
        stream2.Write(chLF,SizeOf(chLF));
        c:=c+1;
       end
      else
       begin // Kein ASCII 10 gefunden -> Buf in Datei schreiben
        stream2.Write(Buf,SizeOf(Buf));
       end;
     end;

  finally
    stream1.Free;
    stream2.Free;
  end;
  writeln('gefundene 0D5C0A: ' + IntToStr(a));
  writeln('gefundene 0D: ' + IntToStr(b));
  writeln('gefundene 0A: ' + IntToStr(c));
  Readln;
end.
MfG
slang
  Mit Zitat antworten Zitat