Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeilen hinzufügen - Probleme mit grossen Logdateien (https://www.delphipraxis.net/57547-zeilen-hinzufuegen-probleme-mit-grossen-logdateien.html)

hirnstroem 23. Nov 2005 07:24


Zeilen hinzufügen - Probleme mit grossen Logdateien
 
'loha Folks

in einer Applikation werden Logdateien etwa folgendermassen erstellt:

Delphi-Quellcode:
procedure TFCDPS_Observer.LogFileTimerTimer(Sender: TObject);
var
  iRow: integer;
  sl: TStringList;
begin
  sl := TStringList.Create;                                              
  try
    if FileExists(LogFilePfad) then                                      
    begin
      sl.Add('');  
    end;                                                      
    sl.SaveToFile(LogFilePfad);                                          
  finally
    sl.Free;                                                            
  end;
end;
Nun ist dies ja gut und schön und funktioniert auch recht gut. Leider entstehen mit anwachsender grösse der Logdatei Probleme mit der CPU Auslastung sowie mit dem Zeitintervall. In der Praxis sieht das so aus, dass zu Testzwecken etwa 12 Stunden Lang geloggt wurde, in diesen 12 Stunden wuchs die Lögdatei auf knapp 9 MB an, die CPU Auslastung war auf 100 % und die Software benötigte, in rasch abwechselndem Rhytmus, zwischen 30 und 40 MB Arbeitsspeicher. Da der Rechner seine besten Jahre schon hinter sich hat, schraubt er so ziemlich auf der Äussersten Rille, was nicht gut ist -.-

Kennt jemand eine Möglichkeit, wie man solche Probleme elegant umschiffen kann?

thx und Grüsse
hirnstroem

RavenIV 23. Nov 2005 07:27

Re: Zeilen hinzufügen - Probleme mit grossen Logdateien
 
verwende doch zum speichern einen filestream.
dann musst du nicht die gesamte Liste im Speicher halten, sondern nur den aktuellen Eintrag.

dieses Thema wurde erst kürzlich hier behandelt. Such einfach mal nach FileStream.

hirnstroem 23. Nov 2005 08:44

Re: Zeilen hinzufügen - Probleme mit grossen Logdateien
 
Vielen Dank RavenIV,

leider sehe ich beim FileStream aber irgendwie die Möglichkeit nicht, wie man Zeilen hinzufügen kann. Die Daten werden zwar gespeichert, aber bei jedem neuen Logeintrag wird alles überschrieben, die Einzelnen einträge, welche von einem Array stammen sind nun allesamt auf derselben Zeile. Wenn mir jemand sagen könnte, wie sich dies beheben lässt...

marabu 23. Nov 2005 10:27

Re: Zeilen hinzufügen - Probleme mit grossen Logdateien
 
Hallo.

Ich weiß nicht, wie DU die Daten wegschreibst, aber das hier könnte vom Prinzip her auch bei dir funktionieren:

Delphi-Quellcode:
procedure Log(filename, msg: string);
var
  fs: TFileStream;
  fm: Word;
begin
  if FileExists(fileName)
    then fm := fmOpenReadWrite
    else fm := fmCreate;
  fs := TFileStream.Create(fileName, fm, fmShareDenyWrite);
  with fs do
  begin
    Position := Size;
    msg := msg + #13#10;
    fs.WriteBuffer(msg[1], Length(msg));
    fs.Free;
  end;
end;
Grüße vom marabu

hirnstroem 23. Nov 2005 11:53

Re: Zeilen hinzufügen - Probleme mit grossen Logdateien
 
Ah, herrlich, danke marabu und RavenIV,

hab das jetzt folgendermassen gelöst:

Delphi-Quellcode:
procedure TFCDPS_Observer.LogFileTimerTimer(Sender: TObject);
var
  iRow: integer;
  LogFileString: string;
  fs: TFileStream;
  fm: word;
begin
  if FileExists(LogFilePfad) then
  begin
    fm := fmOpenReadWrite;
  end
  else
  begin
    fm := fmCreate;
  end;
  fs := TFileStream.Create(LogFilePfad, fm);
  with fs do
  begin
    Position := Size;
    LogFileString := DateTimeToStr(Now) + #13#10;
    for iRow := 0 to sg_data_cd.RowCount - 1 do
    begin
      if sg_data_cd.Cells[0, iRow] <> '' then
      begin
        LogFileString := LogFileString + sg_data_cd.Rows[iRow].CommaText + ',CD' + #13#10;
      end;
    end;
    LogFileString := LogFileString + #13#10;
    for iRow := 0 to sg_data_ld.RowCount - 1 do
    begin
      if sg_data_ld.Cells[0, iRow] <> '' then
      begin
        LogFileString := LogFileString + sg_data_ld.Rows[iRow].CommaText + ',LD' + #13#10;
      end;
    end;
    LogFileString := LogFileString + #13#10;
    fs.WriteBuffer(LogFileString[1], Length(LogFileString));
    fs.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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