Hallo!
Zuersteinmal möchte ich sagen, dass dieses Forum hier ganz klasse ist. Bei Fragen über Google hat mir die Delphi-PRAXiS schon oft weitergeholfen, deswegen habe ich mich jetzt mal angemeldet und starte direkt mit einer Frage.
Mein Programm dient dazu, Dateien aus Ordnern zu bewerten, Kommentare dazu abzulegen und so weiter. Diese Informationen werden in Records in einer TList gehalten, beim Programmstart geladen, beim Beenden gespeichert.
Startet der Benutzer das Programm das erste Mal, sind noch keine Daten gespeichert, das bedeutet, dass das Programm vom Benutzer angegebene Ordner einließt (erstellt Records nur mit Informationen Verzeichnis/Dateiname).
Dann kann der Benutzer mit dem Programm arbeiten und seine Informationen den Records hinzufügen.
Wenn er nun das Programm beendet und neustartet, ließt es erst aus der Datei, die die Records enthält, alle Datensätze ein (nur Ordner und Datei oder eben nach Bearbeitung durch Benutzer Ordner, Datei, Kommentar, Bewertung etc). Weil das Programm aber immer auf dem neusten Stand, was den Inhalt der angegebenen Ordner betrifft, sein muss, ließt es nach dem Lesen der Datei alle Ordner nocheinmal ein, wie bei dem ersten Programmstart, und vergleicht den Inhalt der Records aus der Datei mit der aktuellen, neu gelesenen Ordner/Dateistruktur.
Das funktioniert alles wie gewünscht, nur ist es leider verdammt langsam
... Wenn 20.000 Dateien vorhanden sind und ich diese 20.000 dann gegen die neu eingelesenen abgleiche (sind dann ja auch ca. 20.000), kann das verdammt lange dauern. Weil es eben auch nur ein kleines Tool ist, sind solche Wartezeiten wirklich niemandem zuzumuten. Ich habe es auch so probiert, in die Datei nur Datensätze zu schreiben, wenn Informationen zu der Datei vom Benutzer abgegeben wurden. Aber auch, wenn ich 20.000 gegen 2.000 abgleiche, dauert es viel zu lange.
Es läuft so, dass in einer TStringList alle neu eingelesenen stehen, in einer TList, bestehend aus PFileData sind die Daten, die aus der Liste gelesen wurden. Ich gehe dann die StringList durch, und vergleiche (nur um aufzuzeigen, wie das ungefähr läuft):
Delphi-Quellcode:
if StringList.Strings[x] = PFileData(List.Items[y].Dir) + PFileData(List.Items[y].File) then begin
//Ist in Daten Liste
StringList.Delete(x);
end;
Tja, und da liegt eben meine Frage - kann man das überhaupt so machen? Habt ihr Ideen, wie man das noch schneller hinbekommen könnte? Oder sollte ich lieber eine Datenbank benutzen, wie z.B. SQLite?