AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Bestimmte Records aus einem Array heraussuchen
Thema durchsuchen
Ansicht
Themen-Optionen

Bestimmte Records aus einem Array heraussuchen

Ein Thema von gkoeder · begonnen am 5. Okt 2004 · letzter Beitrag vom 5. Okt 2004
Antwort Antwort
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#1

Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 13:39
Hallo!

In meinem Programm werden Dateiangaben in Records zur Weiterverarbeitung in einem dynamischen Array gespeichert. Ein Eintrag beinhaltet hierbei u.a. Dateinamen, Pfad, etc.
Derzeit durchsuche ich das Array mit einer einfachen for..next-Schleife, bis ich z.B. alle Records mit einem bestimmten Pfad gefunden habe. Das ganze funktioniert auch soweit ganz prächtig. Nur bei einer sehr großen Anzahl von Records (z.B. 100.000 Einträge im Array) dauert es relativ lange, alle Records herauszusuchen.

Ich bin jetzt am überlegen, ob es sinn macht, anstelle eines selbstgebastelten dynamischen Arrays tList zu verwenden und die einzelnen Einträge mit AddObject ranzukleben.


Würde es hier auch einen Geschwindigkeitsvorteil bringen, anstelle von tList tHashedStringList zu verwenden?
Oder hat jemand eine Idee, wie ich das Array performanter durchsuchen kann?

Greetings,
Gerald
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 14:23
Hi,

ob du mit TList schneller bist kann ich auch nicht sagen. Ich verwende aber immer TList oder TStringlist in einer eigenen Klasse für solche Sachen. Das eigentlich deshalb, weil man ne menge Zeit beim proggen spart.
Wenn ich dan nach einem Parameter suchen muß verwende ich vorwiegend TStringList. Der Vorteil ist dann, wenn ich den Rekord einfüge mache ich folgendes:
MyList.Add('mein Suchparameter', MyRecord); Somit kann ich recht komfortabel über Indexof suchen und mir dann mittels erhaltenen Index den passenden Record holen. Für "meinen Suchparameter" sollte dann aber eine Eindeutigkeit gegeben sein, oder man muß sich dann durch die Ergebnisse durchackern.

Diese Art war in der Regel für alle meine Anwendungsfälle ausreichend und schnell genug.

Gruß oki
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#3

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 14:55
gibt es denn nicht die möglichkeit beim erstellen des arrays eine vorsortierung zu machen, dann brauchst du nicht alles zu durchsuchen!
  Mit Zitat antworten Zitat
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 14:59
Zitat von ibp:
gibt es denn nicht die möglichkeit beim erstellen des arrays eine vorsortierung zu machen, dann brauchst du nicht alles zu durchsuchen!
Leider nein, die Daten werden durch einen anderen Prozess übergeben und ich kann hier nicht die Reihenfolge 100%ig definieren.
  Mit Zitat antworten Zitat
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 15:05
Zitat von oki:
Hi,

ob du mit TList schneller bist kann ich auch nicht sagen. Ich verwende aber immer TList oder TStringlist in einer eigenen Klasse für solche Sachen. Das eigentlich deshalb, weil man ne menge Zeit beim proggen spart.
Wenn ich dan nach einem Parameter suchen muß verwende ich vorwiegend TStringList. Der Vorteil ist dann, wenn ich den Rekord einfüge mache ich folgendes:
MyList.Add('mein Suchparameter', MyRecord); Somit kann ich recht komfortabel über Indexof suchen und mir dann mittels erhaltenen Index den passenden Record holen. Für "meinen Suchparameter" sollte dann aber eine Eindeutigkeit gegeben sein, oder man muß sich dann durch die Ergebnisse durchackern.

Diese Art war in der Regel für alle meine Anwendungsfälle ausreichend und schnell genug.

Gruß oki
Hmm ... IndexOf gibt leider nur einen Eintrag zurück; Da bei mir jedoch sehr viele Objekte mit dem Suchparameter übereinstimmen können wird's wohl bei ner For...Next Schleife bleiben, oder gibbets da was schnelleres? (wie gesagt, es können sehr viele Einträge sein)

Greetings,
Gerald
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 15:56
Zitat von gkoeder:
In meinem Programm werden Dateiangaben in Records zur Weiterverarbeitung in einem dynamischen Array gespeichert. Ein Eintrag beinhaltet hierbei u.a. Dateinamen, Pfad, etc.
Derzeit durchsuche ich das Array mit einer einfachen for..next-Schleife, bis ich z.B. alle Records mit einem bestimmten Pfad gefunden habe. Das ganze funktioniert auch soweit ganz prächtig. Nur bei einer sehr großen Anzahl von Records (z.B. 100.000 Einträge im Array) dauert es relativ lange, alle Records herauszusuchen.
Dann wäre eine Baumstruktur mit 2 versch. Knotentypen wahrscheinlich sinnvoller.
Endknoten tragen die Info zu einer Datei (Dateiname, Datum, Grösse, ...), während die Zwischenknoten nur die Info zum Verzeichnis trägt.
Damit wird der Speicherverbrauch für tiefe Verzeichnis drastisch reduziert und die Gefahr dass Speicherplatz
in die SWAP-Datei ausgelagert wird verringert.
Andreas
  Mit Zitat antworten Zitat
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 16:21
Zitat von shmia:
Zitat von gkoeder:
In meinem Programm werden Dateiangaben in Records zur Weiterverarbeitung in einem dynamischen Array gespeichert. Ein Eintrag beinhaltet hierbei u.a. Dateinamen, Pfad, etc.
Derzeit durchsuche ich das Array mit einer einfachen for..next-Schleife, bis ich z.B. alle Records mit einem bestimmten Pfad gefunden habe. Das ganze funktioniert auch soweit ganz prächtig. Nur bei einer sehr großen Anzahl von Records (z.B. 100.000 Einträge im Array) dauert es relativ lange, alle Records herauszusuchen.
Dann wäre eine Baumstruktur mit 2 versch. Knotentypen wahrscheinlich sinnvoller.
Endknoten tragen die Info zu einer Datei (Dateiname, Datum, Grösse, ...), während die Zwischenknoten nur die Info zum Verzeichnis trägt.
Damit wird der Speicherverbrauch für tiefe Verzeichnis drastisch reduziert und die Gefahr dass Speicherplatz
in die SWAP-Datei ausgelagert wird verringert.
Hmm ... wenn ich das richtig verstanden habe, dann kann ich diese Baumstruktur doch realisieren, indem ich die einzelnen Records (Endknoten) in eine StringListe einfüge und benenne (Zwischenknoten -> MyList.Add('Verzeichnisname', Record_InfoKomplett)), oder wie meinst Du das?
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Bestimmte Records aus einem Array heraussuchen

  Alt 5. Okt 2004, 17:04
Moin Leute

Bei den Datenmengen kann man doch schon eine Datenbank nehmen. Wenn der Speicher dick genug ist, würde ich kbmMemTable verwenden. Hast dann Index zur Hand und es geht fix.

Stefan
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  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 06:42 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