Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IniFile zu langsam (https://www.delphipraxis.net/56821-inifile-zu-langsam.html)

r4id3n 11. Nov 2005 21:30

Re: IniFile zu langsam
 
@alzaimar:
Wenn Ini-Dateien aber über 42 kb groß werden, werden diese unendlich langsam! Das ist ein bekanntes Problem!
Das Zauberwort heißt wirklich nur TBigIni....

s.h.a.r.k 11. Nov 2005 21:42

Re: IniFile zu langsam
 
Also falls es euch was hilft: Ich habe da mal so ein Testprogramm geschrieben und mit GetTickCount die Zeit gemessen wie lange eine Sicherung von Daten dauert. Die Rahmenbedingungen waren:

1. Erstellungen von 1000 Dateien
2. Inhalt: jeweils 4 Strings, 4 Integer- und 4 Boolean-Werte
3. Gemessen wurde mit GetTickCount


Die dabei benötigten Zeiten waren:

indizierte Dateien (Type of...): ~ 3000ms
INI-Dateien (IniFile.WriteString): ~ 3000ms
"Normale" Dateien(writeln(bla...)): 150ms

Ich habe damit also nur die Schreibmehtode getestet, nicht die Lesemethode!

bigg 11. Nov 2005 22:58

Re: IniFile zu langsam
 
@s.h.a.r.k.

1. Kannst du getrost streichen, denn es bringt nichts 1000 Dateien anzulegen und diese mit minimalen
Inhalt zu füttern. Wie groß sind die Dateien? Sicherlich nicht größer als 512 Byte, oder?

Wenn du wesentlich mehr Einträge und zudem nur eine Datei anlegst, erhälst du ein genaueres Ergebnis.

Das musste mal gesagt werden :mrgreen:

3_of_8 12. Nov 2005 00:10

Re: IniFile zu langsam
 
Sind indizierte Dateien typisierte Dateien?

fkerber 12. Nov 2005 00:38

Re: IniFile zu langsam
 
HI!

Wenn man nach dem (type of) in Klammer geht wohl schon ;)


Ciao Frederic

alzaimar 12. Nov 2005 10:05

Re: IniFile zu langsam
 
Zitat:

Zitat von r4id3n
@alzaimar:
Wenn Ini-Dateien aber über 42 kb groß werden, werden diese unendlich langsam! Das ist ein bekanntes Problem!
Das Zauberwort heißt wirklich nur TBigIni....

[edit]Das ist kein Problem, sondern in der Tatsache begründet, das TIniFile alle Änderungen per definitionem sofort auf die Platte schreibt. "It's not a bug, it's a feature".[/edit].
Und das Zauberwort heisst sicherlich nicht TBigIni, sondern z.B. 'TFileStream' oder Ähnliches.
  • TIniFile = Richtig langsam
    TBigIniFile = Na ja
    TFileStream = Schnell
Ich hab mal ein Testprogramm (5000 Sections mit je 10 Werten) geschrieben. Hier meine Ergebnisse:
  • BigIni File : 14001 ms
    FastIniFile : 780 ms
    Filestream : 641 ms
TMemIniFile und TIniFile scheiden aus, denn sie sind immer noch nicht fertig ;-).

FastIniFile hab ich eben selbst geschrieben (es basiert auf einer TStringdictionary). Filestream schreibt die Werte als 'Section-Name=Value' in die Datei.

Natürlich ist TBigIni ausreichend, aber was ich meinte, ist das es schon befremdlich ist, sich bei 3GHZ-Rechnern über eine Performance von 1000mszu freuen, um lächerliche 10000 Strings abzuspeichern. Und wie man oben sieht, ist TBigIniFile dann auch irgendwann mal Schrott.

Jelly 12. Nov 2005 10:11

Re: IniFile zu langsam
 
Zitat:

Zitat von alzaimar
Und wie man oben sieht, ist TBigIniFile dann auch irgendwann mal Schrott.

Inifiles sind für solche Datenmengen ja auch einfach nicht gedacht. Und noch zur Ergänzung: eine normale INI Datei darf mit TIniFile nicht grösser als 64kB haben, was bislang noch nicht erwähnt wurde.

neolithos 12. Nov 2005 10:17

Re: IniFile zu langsam
 
Ich würde ja empfehlen solche speziellen Daten binär in eine Datei abzulegen. Sollte das schnellste sein und auch wieder gut auslesbar sein. (Außerdem spart man Platz)

alzaimar 12. Nov 2005 10:29

Re: IniFile zu langsam
 
Hab ich (siehe 'Filestream'). Das ist so gut wie binär, denn irgendwie muss man ja auch die Schlüsselinformation (Section, Name) ablegen. Der zusätzliche Overhead, um die Sachen auch schnell wiederzufinden (TStringDictionary) fällt aber sowieso nicht ins Gewicht.

Man muss dazusagen, das TBigIni ganz nett ist, aber (so wie es der Autor schreibt) nicht optimal. Immerhin schreibt es nicht jede Änderung direkt auf die Platte, wie das TIniFile (gottseidank) tut. Aber man sieht eben auch, das die von Borland bereitgestellten Klassen alles Andere als optimal implementiert sind. Selbst die THashedStringList, die beim TMemIniFile zum Einsatz kommt (wenn ich nicht irre), ist nicht berauschend.

TBigIni benutzt einen einfachen Trick, um schnell zu werden: Es geht zurecht von der Annahme aus, das man die [Section,Name] Tupel nicht wahllos verwendet, sonder i.A. alle Werte einer Section hintereinander schreibt, es entfällt dann die Suche nach den Sections. So genau hab ich mir den jetzt aber nicht angeschaut.

Grundsätzlich ist es aber wirklich so, das man Ini-Files nicht für Tausende von Einstellungen nehmen sollte. Ich würde das dann auch einfach in eine Collection packen und die dann wegstreamen, schon der Ästhetik wegen.

Neutral General 12. Nov 2005 12:05

Re: IniFile zu langsam
 
Guut. Also eigentlich reicht mir die TBigIniFile aus aber:

Ich würde gerne mal die TFastIniFile von r4id3n testen und ich wäre euch dankbar wenn jemand mir mal einen Ansatz mit ein bisschen Quellcode gibt, wie ich das mit einem Filestream machen kann :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr.
Seite 2 von 3     12 3      

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