AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Listen durchwühlen

Ein Thema von wicht · begonnen am 15. Jan 2006 · letzter Beitrag vom 16. Jan 2006
Antwort Antwort
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

2 Listen durchwühlen

  Alt 15. Jan 2006, 20:30
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?
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: 2 Listen durchwühlen

  Alt 15. Jan 2006, 20:54
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: 2 Listen durchwühlen

  Alt 15. Jan 2006, 21:10
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: 2 Listen durchwühlen

  Alt 15. Jan 2006, 22:21
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
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#5

Re: 2 Listen durchwühlen

  Alt 16. Jan 2006, 00:33
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?
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: 2 Listen durchwühlen

  Alt 16. Jan 2006, 08:45
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 Windows Platform SDK.

marabu
  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 11:00 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