Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bestimmte Records aus einem Array heraussuchen (https://www.delphipraxis.net/31164-bestimmte-records-aus-einem-array-heraussuchen.html)

gkoeder 5. Okt 2004 13:39


Bestimmte Records aus einem Array heraussuchen
 
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.

:gruebel:
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

oki 5. Okt 2004 14:23

Re: Bestimmte Records aus einem Array heraussuchen
 
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:
Delphi-Quellcode:
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

ibp 5. Okt 2004 14:55

Re: Bestimmte Records aus einem Array heraussuchen
 
gibt es denn nicht die möglichkeit beim erstellen des arrays eine vorsortierung zu machen, dann brauchst du nicht alles zu durchsuchen!

gkoeder 5. Okt 2004 14:59

Re: Bestimmte Records aus einem Array heraussuchen
 
Zitat:

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.

gkoeder 5. Okt 2004 15:05

Re: Bestimmte Records aus einem Array heraussuchen
 
Zitat:

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:
Delphi-Quellcode:
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

shmia 5. Okt 2004 15:56

Re: Bestimmte Records aus einem Array heraussuchen
 
Zitat:

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.

gkoeder 5. Okt 2004 16:21

Re: Bestimmte Records aus einem Array heraussuchen
 
Zitat:

Zitat von shmia
Zitat:

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?

MacGuyver 5. Okt 2004 17:04

Re: Bestimmte Records aus einem Array heraussuchen
 
Moin Leute :hi:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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