Entwickler-Ecke
Dateizugriff - Ini oder Textdatei - oder doch was anderes?
Sylvus - So 12.04.09 13:41
Titel: Ini oder Textdatei - oder doch was anderes?
Hi Leute, also ich hab ne "Datenbank"! Die besteht immer aus einem User und ein paar Produkten...
Jetzt hatte ich das ganze so in einer Textdatei vorliegen:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| User0 - Produkt 1 User1 - Produkt 1 User1 - Produkt 2 User2 - Produkt 1 User2 - Produkt 2 User2 - Produkt 3 ... |
und hab daraus jetzt eine IniDatei gemacht die so aussieht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| [0] name=User0 Pr0=Produkt1 [1] name=User1 Pr0=Produkt1 Pr1=Produkt2 [2] name=User2 Pr0=Produkt1 Pr1=Produkt2 Pr2=Produkt3 ... |
Insgesammt sind das 1000 User mit ungefähr 16 000 Produkten! Jetzt bin ich grad dabei die IniFile in ein Array/Record einzulesen und es dauert verdammt lange! Jetzt wollte ich fragen woran das liegt :)
Ist die Inidatei langsamer beim durchgehen als die textdatei? Oder liegt es an der Struktur oder doch an meinem Record? Hier dafür nochmal der DelphiCode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Data = record user: string;
Lib: array of Data; ... ini := TIniFile.create(ExtractFilePath(ParamStr(0)) + 'daten.ini'); I := 0; Setlength(Lib, 1); while Ini.ReadString(inttostr(I), 'user', 'no name') <> 'no name' do begin Lib[I].user := Ini.ReadString(inttostr(I), 'user', 'no name'); Inc(I); Setlength(Lib, length(Lib) + 1); end; ini.Free; |
Das dauert jetzt schon ungefähr 15 sekunden und dabei lese ich nur die Namen und noch nichtmal die Produkte ein...darum mach ich mir grad Sorgen!
Vll könnt ihr ja helfen!
Viele Grüße Sylvus
//edit
hab das ganze jetzt mit den Produkten mitrein genommen und jetzt dauert das starten irgendwie extrem lange, warte grad schon 5 min. und hab immer noch kein Fenster (procedure liegt im oncreate ereignis)!
Regan - So 12.04.09 13:56
Also erstmal würde ich dir von der
TIniFile abraten. Ich nehme oft:
FastIniFiles [
http://www.delphi-forum.de/topic_FastIniFiles+32_75874.html]. Oder du nimmst die dort auch erwähnten MemIniFiles.
Dann denke ich, wie du schon geschrieben hast, dass die Arraylänge erweitern so lange dauert. Der Grund: Es wird jedes Mal ein neues Array erstellt, welches um 1 länger ist, und dann werden die alten Daten reinkopiert.
Lösung: Mach dir entweder einen Key, der die Anzahl der Benutzer speichert; oder erhöhe die Länge um z. B. 4 bei jedem Mal. Lezteres ist aber nur eine Notlösung.
jaenicke - So 12.04.09 14:00
Bei 1000 Benutzern und 16000 Produkten geht kaum ein Weg an einer richtigen Datenbank vorbei. Nur damit kannst du solche Datenmengen gut sortieren und filtern usw., das dauert mit Inis oder ähnlichen Lösungen einfach zu lange (und hat ja auch andere Nachteile).
MySQL, SQLite, usw., da gibt es viele Möglichkeiten.
Sylvus - So 12.04.09 14:08
hay, also erst einmal zu den einfachen Sachen :)
An Setlength liegt es glaub ich nicht, hab grad getestet und keinen merklichen Unterschied festgestellt.
Die Datenbanklösung wäre bestimmt die schlauste, allerdings muss ich das morgen fertig bekommen und hab noch nie mit Datenbanken gearbeitet, darum denke ich, dass es für mich in der Zeit einfach so nicht schaffbar ist.
Ich würd jetzt also mal die FastIniFiles testen :) Problem nur:
Wo bekomm ich die?
Wenn ich deinem Link folge bekomme ich zwar das richtige Thema, aber die Links dort sind alle nicht mehr gültig! Könntest du vielleicht die Unit nochmal online stellen, oder mir anders zukommen lassen?
Außerdem noch kurz die Frage, wie ich das einbinde?! Also einfach neue Unit hinzufügen, Unit auswählen bei uses eintragen und dann kann ich die Befehle auf meine "alte" IniFile anwenden?
Vielen Dank
Sylvus
jaenicke - So 12.04.09 14:12
Sylvus hat folgendes geschrieben : |
An Setlength liegt es glaub ich nicht, hab grad getestet und keinen merklichen Unterschied festgesetllt. |
SetLength ist sehr langsam, wenn du das jedesmal aufrufst, merklich wird der Unterschied aber nur, wenn du in 100er Schritten oder noch mehr die Länge des Arrays veränderst.
Die andere Sache: INIs sind nicht besonders schnell, insbesondere bei derartigen Datenmengen. Wenn es um Geschwindigkeit geht, sind Lösungen, die kein Parsen der Datei benötigen, sicher schneller. Typisierte Dateien zum Beispiel. Auch wenn es natürlich mit FastIniFiles sicher schon schneller ist.
Regan - So 12.04.09 14:15
Sylvus hat folgendes geschrieben : |
Wo bekomm ich die? |
Tja. Look up :wink: .
Sylvus hat folgendes geschrieben : |
Außerdem noch kurz die Frage, wie ich das einbinde?! Also einfach neue Unit hinzufügen, Unit auswählen bei uses eintragen und dann kann ich die Befehle auf meine "alte" IniFile anwenden? |
Nicht ganz. Das aufrufen der Sektionen geht mit
EnterSection. Dafür brauchst du die dann nicht mehr im Abfragen der Werte hinschreiben.
Sylvus - So 12.04.09 14:17
jep, aber ich hatte jetzt "Setlength(Lib, 1056);" geschrieben und damit das ganze rausgeschafft, das einlesen hat aber trotzdem mehrer Sekunden gedauert... Lohnt es sich dann von der Performance jetzt auf typisierte Datein umzusteigen, also ich lerne gerne was neues, aber wenn ich unter Zeitdruck stehe will ich lieber nichts "umsonst" machen :) Und wenn ich jetzt meine ganze IniDatei sozuagen neu strukturieren müsste - um die Daten in eine .bat Datei zu schreiben, wäre das, für mich, ohne wirklichen Nutzen zu viel Zeitaufwand...
Vielleicht kannst du mir ja noch ein paar Infos dadrüber geben :)
Wäre sehr nett!
Lg Sylvus
Sylvus - So 12.04.09 14:23
Ok also ich mach jetzt folgendes:
- Teste schnell die FastIniFiles, sollte ja nicht so schwer sein, wenn das nicht wirklich schneller geht schau ich mir mal den Link zu der SQLite Datenbank an und wenn das alles zu schwer ist gehe ich zu den typisierten Datein über!
Vielen Dank schonmal an alle, die hier so toll geholfen haben :) Vielleicht schreib ich ja gleich noch neue Probleme, dann aber wahrscheinlich zu nem anderen Thema *g*
Wenn ihr noch was anzumerken habt, ich bin gerne offen für alles!
Viele Grüße und ein tolles Fest
Sylvus
//die FastIniFiles scheinen schonmal deutlich schneller zu sein, mache jetzt den test mit den Produkten... :)
// Die FastIni Files machen hier ganz klar das rennen, Programm braucht jetzt zum starten vll ne Sekunde, das ist schon sehr cool :) Aber ich hab Lust auf die Datenbank+typisierte Datein bekommen, werd das dann als Vergleich nach den Ferien nochmal testen, wenn der ganze Stress vorbei ist! Vielen Dank nochmal und großes Lob an Silas^^
Bye bye
//Noch ne Frage :) Die Sonderzeichen also: ò ... gehen nicht, kann man da noch was machen?
Flamefire - So 12.04.09 16:22
erst mal zu deiner lösung:
Delphi-Quelltext
1: 2:
| while Ini.ReadString(inttostr(I), 'user', 'no name') <> 'no name' do begin Lib[I].user := Ini.ReadString(inttostr(I), 'user', 'no name'); |
nicht sehr sinnvoll, den eintrag 2 mal zu lesen, speicher ihn lieber zwischen
und als default-wert nimm lieber den leeren string, der beim vergleich schneller ist (logisch oder?)
dann kommst du besser, wenn du die anzahl der einträge mit speicherst. dann kannst du dein array gleich auf die richtige größe setzen und brauchst den vergleich nicht mehr (was passiert bei deiner variante beim löschen? da muss ja alles verschoben werden)
für dein problem sind datenbanken DIE lösung. die sind genau dafür da und sehr schnell.
ansonsten wenigstens typisierte datein. mehr aufwand bei der programmierung als ini-files aber deutlich schneller.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!