AGB  ·  Datenschutz  ·  Impressum  







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

Programm mit TFilestreams zu langsam

Ein Thema von slang · begonnen am 10. Jan 2007 · letzter Beitrag vom 22. Okt 2008
 
slang

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

Programm mit TFilestreams zu langsam

  Alt 10. Jan 2007, 11: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
 


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 13:11 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