AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Was ich gerne wissen würde: Welchen Vorteil bringt ein TFileStream gegenüber einem normalen Textfile, vor allem bei sequenziellem Zugriff? Ich stelle mir vor, das beim sequentiellen Lesen ein Textfile genauso im Windows Cache gepuffert wird wie ein Filestream, und dass deshalb hinsichtlich der Geschwindigkeit kaum ein Vorteil zu erzielen ist?
|
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Erstmal kann AssignFile+ReadLn nur mit ANSI-Dateien umgehen (auch unter Delphi 2009+).
Standardmäßig hat diese wirklich alte Pascal-Funktion auch für Textdateien einen sehr schlecht eingestellten eigenen Puffer (gut, daß kann man etwas ändern) Und dann sind diese Funktionen auch nicht gerade OOP-Konform. TStringList, TStringStream und Co. haben das "Problem, daß sie die komplette Datei in den Arbeitsspeicher laden, also schlecht für große Dateien. |
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Was wirklich fehlt ist ein seek was auf Zeilenbasis funktioniert. Gruß K-H |
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Zitat:
Die Dateivariable ist ein großer Record (auch wenn man es ihr nicht ansieht) Und dieses kann bei Weitergabe an andere Funktionen Probleme bereiten (es muß mit VAR übergeben werden und der Compiler bemängelt ein Fehlen von VAR nicht). Zitat:
Hier hab ich ja sowas versucht umzusetzen und da steckt jetzt schon eine ganze Menge an Arbeit drin und dennoch gefällt es mir noch nicht richtig. Zitat:
Praktisch sind diese funktionen nur noch für eine Abwärtskompatibilität enthalten und da hat man sich eine Umstellung einfach gespart und nur alles so geändert, daß der Dateiinhalt sicher mit Ansi läuft (AnsiString, AnsiChar-Array und Co.) |
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Ich möchte an der Stelle auch einmal auf eine Umsetzung als Stream von Flamefire hinweisen:
http://www.delphi-forum.de/viewtopic.php?t=100088 Es ist praktisch eine Weiterentwicklung als Nachfahre von TStream und damit universell einsetzbar. Da er dies dort schon umgesetzt hat, spare ich mir den Aufwand, denn etwas ähnliches hatte ich auch im Sinn. :mrgreen: |
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Hallo Sebastian,
ich habe versucht, Dein Programm für meine Zwecke zu erweitern. Das ist mir auch gelungen, aber an einer Stelle haut es ihn immer wieder raus. Er soll die Position eines String suchen und setzt gleichzeitig die Position des Readers auf diese : Beispiel : f := TSJMmfFileReader.Create(Dateiname); f.Position := f.StringPos(S);
Delphi-Quellcode:
Das Setzen der Position geht bei mir solange gut, bis ich zu einer Position mit der Größe von 2.386.487 komme. Bei SetPosition ruft er ReInitView auf. MapViewOfFile setzt dann FPointer auf nil. In ReadLn haut es ihn dann raus.
function TSJMmfFileReader.StringPos(AValue: string): Int64;
var s: string; begin Result := -1; while Position < FSize do begin ReadLn(s); if s = AValue then begin Result := Position; Exit; end; end; end; Kannst Du mir sagen, was ich falsch mache? Gruss Jens Edit: Sooo..., warum der Fehler auftritt, weiß ich immer noch nicht, aber so scheint es zu funktionieren : Beispiel: f := TSJMmfFileReader.Create(Dateiname); f.GotoString(S);
Delphi-Quellcode:
function TSJMmfFileReader.GotoString(AValue: string): Boolean;
var s: string; begin Result := False; Position := 0; while Position < FSize do begin ReadLn(s); if s = AValue then begin Result := True; Exit; end; end; end; |
AW: SJ MMF File Reader 0.2 - Schneller Textdatei Reader
Hier noch einige Erweiterungen. Vielleicht sind sie hilfreich.
Delphi-Quellcode:
uses
.., AnsiStrings, Math; procedure TSJMmfFileReader.ReadlnFloat(var AValue: Double); var s: string; begin Readln(s); if ContainsText(UpperCase(s), '+INF') then begin AValue := Infinity; Exit; end; if ContainsText(UpperCase(s), '-INF') then begin AValue := NegInfinity; Exit; end; if ContainsText(UpperCase(s), 'NAN') then begin AValue := NaN; Exit; end; s := StringReplace(s, '.', ',', [rfReplaceAll]); AValue := StrToFloat(s); end;
Delphi-Quellcode:
procedure TSJMmfFileReader.ReadlnBool(var AValue: Boolean);
var s: string; begin Readln(s); if UpperCase(s) = 'TRUE' then AValue := True; if UpperCase(s) = 'FALSE' then AValue := False; end;
Delphi-Quellcode:
procedure TSJMmfFileReader.ReadlnInt(var AValue: Integer);
var s: string; begin Readln(s); AValue := StrToInt(s); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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