![]() |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
@Uwe :thumb:
Das hat den Vorteil einer seeeehr genauen Zeitmessung, weil die intern verwendete Funktion
Delphi-Quellcode:
einen "High Resolution Counter" mit einer Genauigkeit von 0.00083 ms (!) abfragt.
QueryPerformanceCounter
Gruß, Andreas |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
Zitat:
----- Zwischenzeitlich hatte ich auch einen anderen Weg getestet, bei dem keine Strings aus der Liste gelöscht werden und stattdessen eine Variable mit der aktuellen Zeile hochgezählt wird, ab der in der Schleife gesucht wird. Der Unterschied in der Laufzeit war zu vernachlässigen. Mit den ordentlichen Zeitmessungen muss ich mich noch beschäftigen. Grüße Dalai |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
Nach ein paar Tests mit TStopwatch und einer absichtlich großen PEM-Datei (etwas über 1 MiB) stelle ich Folgendes fest:
Das Verarbeiten der Textdatei (nach LoadFromFile!) mittels Löschen von Strings - siehe OP - dauert um die 200ms, mit dem Hochzählen des Index nur zwischen ca. 20 und 40ms. Ich habe mich nun für das Hochzählen des Index mit folgender Implementation entschieden:
Delphi-Quellcode:
IndexOf hab ich frecherweise aus dem Quellcode von TStrings.IndexOf kopiert und lediglich einen Parameter ergänzt:
procedure NameNotRelevant;
var Lsl: TMyStringList; LidxH, LidxF: integer; Lheaderpresent: Boolean; Lstr: string; begin Lsl:= TMyStringList.Create; try Lsl.LoadFromFile(FFileName); LidxF:= 0; Lheaderpresent:= False; repeat LidxH:= Lsl.IndexOf(PEM_HEADER, LidxF); LidxF:= Lsl.IndexOf(PEM_FOOTER, LidxF+1); if LidxH < 0 then begin if NOT Lheaderpresent then NameNotRelevant2(Lstr); end else begin Lheaderpresent:= True; Lstr:= Trim(Lsl.StringsBetween(LidxH+1, LidxF-1)); NameNotRelevant2(Lstr); Inc(LidxF); end; until LidxH < 0; finally Lsl.Free; end; end; procedure NameNotRelevant2(const ACertStr: string); var Lblob: CERT_BLOB; begin if Length(ACertStr) = 0 then Exit; Lblob.cbData:= Length(ACertStr) * SizeOf(Char); GetMem(Lblob.pbData); try Move(ACertStr[1], Lblob.pbData^, Lblob.cbData); // Do something with Lblob finally FreeMem(Lblob.pbData); end; end;
Delphi-Quellcode:
Wieso gibt's davon eigentlich standardmäßig keine solche Überladung?
function TMyStringList.IndexOf(const S: string; StartIndex: integer): integer;
begin for Result := StartIndex to GetCount - 1 do if AnsiCompareText(Get(Result), S) = 0 then Exit; Result := -1; end; ----- Wenn jemand eine schnellere Variante hat, kann die gern gepostet werden. Auf alle Fälle danke ich allen Postern für die rege Beteiligung! :dp: Grüße Dalai |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
Musst Du auf Groß-/Kleinschreibung achten bzw. nicht beachten?
Sind die zu suchenden Zeichenfolgen (PEM_HEADER bzw. PEM_FOOTER immer gleich geschrieben? Im zweiten Fall könntest Du das AnsiCompareText weglassen. Das Dauer durchaus auch seine Zeit. |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
Ich würde einen Ansatz per TStreamReader vorschlagen. Dabei wird nicht erst die ganze Datei in den Speicher geladen und es sind weder IndexOf noch StringsBetween nötig:
Delphi-Quellcode:
uses
System.SysUtils, System.Classes; ... procedure NameNotRelevant; var reader: TStreamReader; line: string; data: string; begin reader := TStreamReader.Create(FFileName); try data := ''; while not reader.EndOfStream do begin line := reader.ReadLine; if line = PEM_HEADER then begin data := ''; end else if line = PEM_FOOTER then begin NameNotRelevant2(data); data := ''; end else begin data := data + TrimRight(line); end; end; finally reader.Free; end; end; |
AW: Effizientes Einlesen und Verarbeiten von Textdatei
Zitat:
Die Variante hat noch einen weiteren Nachteil: Dateien ohne Header werden nicht berücksichtigt. Ja, das hatte ich nicht erwähnt, und deshalb konnte das keiner sonst wissen. Zitat:
Zitat:
Grüße Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz