AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TFileStringList
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStringList

Ein Thema von himitsu · begonnen am 10. Mai 2010 · letzter Beitrag vom 2. Jun 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
Mahlzeit,

ich hätte hier eine Art StringList, welche mit irgendeiner Textdatei verbunden sein kann
und, ohne den Textinhalt komplett in den RAM zu laden, diesen zum Zugriff bereitstellt.
Diese StringListe, bzw. die Datei läßt natürlich sich auch bearbeiten.
(Create und/oder LoadFromFile erstellt quasi nur einen Zeilenindex)

Num müßte ich dieses "Monstrum" eh mal etwas überarbeiten und wollte da gerne mal etwas rumfragen.


Aktuell kann diese Stringliste theoretisch bis zu 89.478.483 Zeilen (also 2 GB Index) mit maximal 2 GB pro Zeile verwalten.
Ich denke mal die Zeilenlänge dürfte ausreichend sein, aber ich überlege grade, ob ich den Index in eine temporäre MMF auslagern soll, womit diese 90-tausender Zeilengrenze auch gleich mit wegfallen würde und nebenbei würde der RAM noch etwas geschont.

Würde jemand sowas gebrauchen können oder kann ich mir eine Änderung diesbezüglich sparen?


PS: Die Klasse wäre ab Delphi 2009 und würde auch alle möglichen Stringkodierungen in der Datei erlauben.
Änderungen (Zeilen hinzugefügen oder geändern) könnte man, solange der Speicher ausreicht, auch im RAM belassen und so eine Datei dennoch als ReadOnly öffnen oder einen Großteil der nötige Zeit, zum Ändern/Speichern der Datei, einsparen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
 
daywalker9

 
Delphi XE3 Professional
 
#2
  Alt 11. Mai 2010, 22:01
Klingt gar nicht schlecht. Kann ich für einige Dinge gebrauchen. Kann man die aktuelle Version bereits herunterladen?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#3
  Alt 16. Mai 2010, 12:56
So, hat ein bissl länger gedauert, als geplant.

Hab noch nich alles getestet, aber es scheint zu laufen.
(grade eben einen hartnäckigen/fießen Fehler ausgemärzt, welcher alles aufhielt ... schon blöd, wenn man beim Löschen eines Puffers vergißt das Offset entsprechend zu verschieben )

Aber es wird noch Einiges geändert werden: (weshalb ich einige Testes erstmal verschoben hab)
  • Vorallem ist es derzeit noch von TStrings abgeleitet.
    Aber ich schau demnächst, wie ich es von TStringList ableiten kann.

    (da muß man allerdings mehr aufpassen, da TStringList vorallem schon seine eigene Speicherverwaltung mitbringt ... also daß diese mir dann nicht in die Quere kommt, da ich ja eine Eigene hab)
  • Nja, die "normale" Speicherroutine (.Flush) hatte einen Fehler, weshalb diese auch inaktiv ist.
    Sie wird aktuell über SecureFlush umgeleitet, welches die Daten über eine temporäre Datei handhabt, anstatt alles direkt in der Datei umzuorganisieren.
  • Das war's eigentlich, was an Änderungen geplant ist.
    Und es wird womit eigentlich nur noch interne Umstruktorierungen geben.

Gut, nun schonmal was zur Klasse:
  • Man kann diese StringListe mir einer Textdatei verbinden, wobei die Strigs/Zeilen nicht in den Arbeitsspeicher geladen werden.
  • Die StringListe kann aber auch mit irgendeinem einem Stream verbunden sein.
    ( dieses geschieht jeweils entweder über .Create oder über AssignToFile, bzw. AssignToStream )
  • Änderungen landen im Arbeitsspeicher, können aber entweder in die Datei (.Flush) oder in eine intern verwaltete temporäre Datei (im %TEMP%-Verzeichnis) ausgelagert werden.
  • Die Temp-Datei sollte vom System (Windows) automatisch gelöscht werden, sobald alle Handles geschlossen sind.
  • Abgesehn von der Indexliste und den Änderungen belastet also nix den Arbeitsspeicher.
  • Die StringListe kann aber auch ohne verbundene Datei/Stream verwendet werden, wo sie dann als Hasched-StringList, mit der Möglichkeit einer Auslagerung in eine Tempdatei, genutzt werden kann.
  • Zwei wichtige Änderungen, gegenüber allen anderen StringList-Klassen (TStrings und Co.) muß ich aber erwähnen:

    Wenn man einer Zeile (.Add, .Insert .Strings[] und Co.) einen Text übergibt, welcher Zeilenumbrüche oder ein #0 enthält, dann wird ab der #0 abgebrochen und an den Zeilenumbrüchen wird es zerlegt.
    SL.Add('abc'#10'xyz'); Bei TStringList führt dieses nur zu einer Zeile.
    Es ist alles zusammen über .Strings auslesbar und natürlich erhöt sich .Count nur um 1.

    Bei meiner TFileStringList werden entsprechend 2 Zeilen eingefügt, damit die Zeilenzählung korrekt arbeitet.
  • Und vielleicht ist schonmal der zusätzliche Zeilenumbruch aufgefallen, welchen die anderen Stringlisten nach die letze Zeile schmuggeln oder der Zeilenumbruch nach der letzen Zeile, welcher in der Datei nich vorhanden ist, aber in der Stringliste ... das passiert hier auch nicht.

    Ist in der Datei nach der letzen Zeile ein Zeilenumbruch, dann gibt es in der SL eine Leerzeile am Schluß.
    Und dafür wird beim Speichern nach der letzen Zeile kein Zeilenumbruch eingefügt.
    Fazit: steht in der Datei kein Zeilenumbruch als Letzes, dann wird auch keiner beim Speichern eingefügt, wärend TStringList und Co. diesen einfügen.


( PS: nicht über die auskommentierten Zeilen im Klassen-Header wundern ... es ist nur alles Mögliche ein bissl sortiert aufgelistet, welches quasi unterstützt wird, was aber nicht unbedingt direkt in der Klasse implementiert ist. )

[edit]
Die Version mit der Ableitung von TStringList scheint so weit ok zu sein ... hoff ich mal, da so einiges umgeleitet/verschoben werden mußte.
Angehängte Dateien
Dateityp: pas indexstringlist_253.pas (54,1 KB, 21x aufgerufen)
Dateityp: pas indexstringlist_784.pas (53,5 KB, 24x aufgerufen)
  Mit Zitat antworten Zitat
2. Jun 2010, 18:33
Dieses Thema wurde von "Matze" von "Klatsch und Tratsch" nach "Open-Source" verschoben.
Antwort Antwort


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 00:51 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