AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TSimpleTable - Zugriff auf typisierte Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

TSimpleTable - Zugriff auf typisierte Dateien

Ein Thema von Satty67 · begonnen am 16. Mai 2009 · letzter Beitrag vom 16. Mai 2009
Antwort Antwort
Satty67
Registriert seit: 24. Feb 2007
TSimpleTable ist eine Komponente zum Zugriff auf typisierte Dateien (File of Record)

Die Komponente wurde primär geschrieben, um meine Sammlung solcher Daten-Dateien im Stil TTable einfach zu importieren und danach in eine FireBird-Datenbank zu exportieren. Das ist auch der Hauptzweck dieser Komponente... Import von Daten. Die Methoden Read (Set RecNo), Update und Append sind auch weitestgehend nur durch die Geschwindigkeit der Hardware beschränkt.

Später wurde TSimpleTable um einen Index erweitert (was nicht 100% optimal gelungen ist) um Funktionen wie Sortieren und Filtern zu ermöglichen. Dadurch kann damit eine Tabellen-Datei wie eine kleine Datenbank angesteuert werden.

Ob das in Anbetracht der Konkurrenz (INI, XML und SQL) überhaupt sinnvoll ist, muss jeder für sich selbst entscheiden. Für einen stark begrenzten Bereich kann es einen Einsatzzweck geben. Bei mir ist es eine alte Anwendung, die weiterhin die Daten als File of Record benötigt und durch ein Delphi-Programm unterstützt wird.

Damit niemand die Katz im Sack "kauft", hier die mir bekannten Beschränkungen:

Ohne weitere umfangreiche Tests empfehle ich keinen kommerziellen produktiv Einsatz!

Bei Delphi 5

muss FastMM4 eingebunden sein (in der Demo ist es das). Auch bei höheren Delphi-Versionen, solange dort der memoryManager noch so schlecht ist.

Delphi 2009

Unicode wird nicht unterstützt. Zwar hab' ich anfangs versucht Probleme zu vermeiden, aber mangels Testumgebung hab' ich es aufgegeben. Anpassen müssten das Delphi 2009 Benutzer dann selber.

Delete, Cut, DeleteRange

Durch die nachträgliche Implementierung des Index, ist der nicht optimal integriert. Besonders gelitten haben die Funktionen DeleteRange und CutRange. Da diese keinen zusammenhängenden Block mehr erwarten dürfen, sind die nötigen Anpassungen stark auf die Geschwindigkeit gegangen. CutRange wurde komplett entfernt, da es zum Harddisk-Stresstest wurde.

Das ganze könnte man wieder verbessern, wenn man die Suche im Index optimiert (Prinzip dafür liegt hier bereit) und für den anschließenden Löschvorgang die Datensätze wieder nach Offset sortiert.

Delete und Cut sind auch langsamer geworden, da jetzt umständlich im Index nach der Offset-Position gesucht wird. Sind bei mittlerer Dateigröße nur wenige Millisekunden, weshalb es nicht so schlimm ist, wenn diese Funktionen nicht in Serie aufgerufen werden.

Bis 100.000 Datensätze oder 100 MByte sind die Geschwindigkeit-Schwächen noch erträglich. Ab 1.000.000 Datensätze bzw. 1 GByte wird aber insbesondere DeleteRange indiskutabel langsam.

Für die Größe ist es aber sowieso das falsche Datenformat. Wer es doch verwendet, sollte in der Anwendung eine Verwaltung für gelöschte Datensätze einrichten.

Sort und Filter

Beide Funktionen benötigen einen Index, der dynamisch im Speicher angelegt wird. Dazu wird natürlich die Datei durchlaufen, was bei sehr großen Dateien Zeit kostet.

Sortieren (OrderBy) wird nur für eine Datenspalte unterstützt, was seinen Grund in der nicht optimalen Indexverwaltung hat.

Filtern funktioniert ganz gut. Derzeit noch ein kleines Problem mit dem Vergleich Leerstrings mit ordinalen Werten (Der Leerstring wird zu "0" statt NUL)

Praktische und theoretische Grenzen

Theoretisch ist die Dateigröße auf 2 Gigabyte und die Datensatzanzahl auf High(LongInt) abzüglich Headergröße beschränkt. Praktisch setzt die Geschwindigkeit schon weit früher seine Grenzen. Nur das reine Lesen und Schreiben (ohne Sort, Filter, delete & Cut) zeigt sich durch die Größe unbeeindruckt (was ja auch das primäre Ziel war).

Auf meinem System (Intel Q9550 / 7200er HD) läuft alles bis ca. 100.000 Datensätze oder 100 MByte Dateigröße recht flott. Spätestens bei 1 Mio. Datensätzen oder 1 GByte Dateigröße wünscht man sich dringen ein anderes Datenbank-Format.

Geplante Erweiterungen

So schnell ist keine Erweiterung/Verbesserung der Komponente geplant, da der aktuelle Zustand schon weit über meinen eigenen Bedarf reicht. Trotzdem gibt es eine ToDo-Liste, die ich in größeren Abständen wohl auch noch abarbeite.

- Verbesserung des Index und damit Sort und Filter
- DeletRange und CutRange wieder leistungsfähig implementieren
- kleine Verwaltung für Trash-Records (boolean Feld markiert gelöschte Datensätze)

Das Attachment

...enthält den kompletten Projekt-Ordner (ohne Symboldatei und *.dsk) mit allen Sourcen zu TSimpleTable, SimpelTable_Demo (incl. Exe) und etwas Dokumentation.

\SimpleTable Dateien der Komponente
\SimpleTable\Demo Das Demo-Projekt
\SimpleTable\Bin compiliertes Demo-Projekt
\SimpleTable\Doc ein paar Dokumente

SimpelTable_Demo ist kein Meisterwerk, aber ausreichend um die Funktionen schnell zu Testen und zu Sehen, wie ich einzelne Funktionen anwende. Wer nur mal schnell sehen will, wie schnell (langsam) alles arbeitet, kann ja nur die EXE starten und etwas experimentieren. (Es können damit gefüllte Test-Tabellen angelegt werden!)

Wer die Demo compilieren will braucht nicht unbedingt TSimpleTable als installierte Komponente. Wer es dynamisch einbinden will, entfernt die // in der Form-Deklaration:
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    LastStatus : String;
    //{$DEFINE DYNAMIC_SIMPLETABLE} SimpleTable1 : TSimpleTable;
    procedure OpenTable(TableName : string);
FastMM4 im Projekt-Quellcode entfernen geht auch, aber das wird dann zumindes bei D5 Horror langsam.

OK, alles ist beschrieben (und schlecht gemacht), dann viel Spass damit!

Kompatibilität (kompilierbar und miniDB-Format kompatibel erzeugt):

Delphi 5 Professional
TurboDelphi 2006

HotFix 16.05.2009 23:45
Bei st_FilePlain (also Dateien ohne Header) hatte sich in letzter Minute beim Bereinigen des Codes ein kleiner Fehler in die Erkennung der Dateigröße eingeschlichen. Dateien waren dadurch nicht zu öffnen. Sorry!
17.05.2009 09:06
Kompatibilität von Delphi 5 zu TurboDelphi2006 verbessert. (Abweichende Record Ausrichtung). Alte Test-Tabellen lassen sich nicht mehr öffnen, aber denke nach einem Tag ist es besser das für mehr Austauschbarkeit in Kauf zu nehmen.
Zudem dem Verweis auf eine Shared-Unit gegen die im Paket ausgetauscht.
21.05.2009 09:27
FreeAndNil(Object) statt nur Object.Free, da Assigned(Object) unter TD2006 die Objekte nicht als freigegeben erkannte.
Angehängte Dateien
Dateityp: 7z simpletable_20090521_0927_rc_150.7z (422,4 KB, 40x aufgerufen)
Dateityp: 7z test-tabelle_from_delphi_5_452.7z (866 Bytes, 23x aufgerufen)
 
Satty67

 
Delphi 2007 Professional
 
#2
  Alt 16. Mai 2009, 23:22
Da mit der Demo Dateien ohne Header nicht geöffnet werden können (was mir beim Testen am Schluß auch den Hotfix einbrockte), hier ein kleiner Beispielcode...

Angenommen eine Datei wurde bisher mit folgendem Record bearbeitet:
Delphi-Quellcode:
TArtikel = packed record
  Nummer : String[20];
  Beschreibung : String[80];
  Bestand : Boolean;
  Gewicht : Double;
end;
Wird diese mit SimpleTable so geöffnet:
Delphi-Quellcode:
var
  i : Integer;
begin
  ListBox1.Clear;
  if OpenDialog1.Execute then begin
    with SimpleTable1 do begin
      FieldDefs.Clear;
      FieldDefs.Add('Nummer', st_ShortStr, 20);
      FieldDefs.Add('Beschreibung',st_ShortStr, 80);
      FieldDefs.Add('Bestand', st_Boolean, 0);
      FieldDefs.Add('Gewicht', st_Double, 2);

      FileName := OpenDialog1.FileName;
      StorageMode := st_FilePlain;
      Open;

      // Ab hier nur zum Testen eine Anzeige in einer Listbox...
      for i := 1 to RecCount do begin
        RecNo := i;
        ListBox1.Items.Add(Fields[0].AsString+'-'+FieldByName('Beschreibung').AsString);
      end;
      Close;
    end;
  end;
end;
  Mit Zitat antworten Zitat
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 09:27 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