![]() |
2 Listen durchwühlen
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:
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?
if StringList.Strings[x] = PFileData(List.Items[y].Dir) + PFileData(List.Items[y].File) then begin
//Ist in Daten Liste StringList.Delete(x); end; |
Re: 2 Listen durchwühlen
ich würde einfach die Prüfung in einen Thread packen der im Hintergrund läuft. So kann der Nutzer schon neues anlegen während im Hintergrund noch geprüft wird.
|
Re: 2 Listen durchwühlen
Hi,
benutz lieber eine THashedStringList und benutz die Sortiert. Dann ist der Zugriff auf einzelne Elemente schon etwas schneller. Mittels der Funktion IndexOf(s) kannst du ermitteln ob der String s sich in deiner StringList befindet und wenn ja an welche Position. Dann wäre wohl noch das Property Objects[] zu erwähnen, du kannst jedem Eintrag deiner StringList noch ein beliebiges TObject anhängen. Wenn du also zu jeder Datei noch eine Klasse hast, die du anhängst, hast du so einen einfach Zugriff. Für das Abgleichen würde ich auch sagen, bietet sich ein Thread an, der dass ganze mit niedrigerer Priorität im Hintergrund erledigt. Gruß Der Unwissende |
Re: 2 Listen durchwühlen
Herzlich Willkommen in der Delphi-PRAXiS, wicht.
Eigentlich weiß ich viel zu wenig über dein Programm, aber wenn die Informationen schon im file system abgelegt werden, dann würde ich sie gleich bei der Datei speichern (property storage, DateiInfo) - so sind sie genau da wo sie gesucht werden. Auf meiner Platte befinden sich 900.000 Dateien - die würde ich nie alle gleichzeitig in einer Benutzerschnittstelle zeigen wollen. Also würde ich nur das in den Speicher laden, was gerade nötig ist (virtual ListView). Freundliche Grüße vom marabu |
Re: 2 Listen durchwühlen
Hi :)
Also, der Benutzer kann nach Dateien suchen oder mit einer Art Explorer navigieren. Das wird auch schon mit einem TVirtualStringTree gemacht. Die Daten in die Dateien direkt zu schreiben wäre schön, ist aber leider nicht möglich.. oder habe ich dich falsch verstanden? |
Re: 2 Listen durchwühlen
Hallo Alexander,
direkt in die Datei schreiben - ja und nein. Seit Windows 95 kannst du eine Datei auch als Objekt (compound file) ansehen - und Objekte haben Eigenschaften (properties). Schau dir einmal die Eigenschaften einer Datei in der Shell an und du wirst ein property sheet mit dem Titel Dateiinfo entdecken, welches dir die für diesen Dateityp registrierten Standardeigenschaften zugänglich macht. Für alle Dokumente im weitesten Sinne wird der property set DocumentSummary bereit gestellt, der u.a. die Eigenschaften Kommentar und Kategorie mitbringt - genau das was du brauchst. Informationen hierzu findest du im ![]() marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr. |
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