Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Große Datenmenge -> welches Format (array, stringlist..)
zongo-joe - Fr 31.10.08 15:50
Titel: Große Datenmenge -> welches Format (array, stringlist..)
Tach zusammen,
ich möchte mit einer liste von etwa 20.000 strings arbeiten (medizinische Codes), in dieser Liste muss ich sortieren, suchen und eine Ähnlichkeitssuche starten (also zB nach Begriffen, die in den Codes vorkommen, suchen).
Da ich keine Ahnung von Datenbanken habe: womit bin ich denn in Delphi am schnellsten, das Arbeiten mit Arrays ist ja net so flott, und auch ne Stringlist hat da keine wesentliche Verbesserung gebracht.
Hat noch einer von Euch einen besseren Vorschlag ?
Danke & Gruß,
Zongo
delphiprogrammierer - Fr 31.10.08 16:01
Ich würde eine Objectliste machen und dort meine Objecte reinstellen. Die Objekte enthalten dann unter anderem diese Strings.
Ein Array halte ich hier für nicht geeignet.
Happy Helloweeeeeeeen
Gausi - Fr 31.10.08 16:29
Da eine Stringlist auch nur ein Array ist, ist der geringe Unterschied nicht so überraschend. Auch eine Objectlist ist nur ein Array. So pauschal lässt sich das nicht sagen, was da besser ist.
Wie baust du denn das Array (die Stringlist) auf? Wie kommen die Elemente da rein? Wie werden die sortiert? Wie suchst du? Und wie machst du die Ähnlichkeitssuche?
zongo-joe - Fr 31.10.08 22:50
sorry, war etwas gehetzt afk
also die Daten lese ich aus einer einfachen textdatei ein und bisher habe ich ein großes array definiert und suche einfach (bei bekanntem Anfang des Suchbegriffs) binär oder (wenn nur Mittelteile des Suchbegriffs bekannt sind) mit ner FOR-Schleife, aber das dauert halt sehr lang...
Wie geht denn das schlauer ?
alzaimar - Fr 31.10.08 22:55
Ne hashmap oder eine kleine Access-DB.
zongo-joe - Fr 31.10.08 22:59
na ja, mit DBs kenn ich mich halt gar nicht aus, hab ich noch wie was gemacht.
was ist ne Hashmap ?
alzaimar - Fr 31.10.08 23:19
Eine Hashmap ist eine Datenstruktur, die sehr schnell 'Schlüssel' findet. Für Ähnlichkeitssuchen (eben gelesen) ist sie aber nicht geeignet.
matze - Mo 03.11.08 10:17
Also eine StringList die du auf sorted := true stellst ist schon mal recht fix, wenn du per IndexOf nach den Elementen suchst.
Mach doch mal ein Testprogramm in dem du dein Szenario mit einer Stringliste und mit einer HashedStringList (unit INI Files) realisierst.
jasocul - Mo 03.11.08 12:50
Sobald du eine Ähnlichkeitssuche machen musst, wirst du immer Geschwindigkeitsprobleme bekommen, da du keinen Schlüssel verwenden kannst.
Gibt es bei der Ähnlichkeitssuche irgendwelche Strukturen, die du nutzen kannst? Ich denke da z.B. an strukturen in den Nummern, die du durchsuchst. Wenn die Nummer in Blöcke geteilt ist und man die Nummer im zweiten Block durchsuchen will, dann bietet es sich an, mehrere Listen zu verwalten.
Beispiel:
Nummern
123 456789
123 423879
123 037561
-
124 436568
124 054715
-
125 476942
125 031278
Damit machst du drei Listen. In jeder sind nur die Nummern des eigenen Blocks drin.
Wird nun nach dem zweiten Block gesucht, musst du nur noch in jeder Liste Schlüssel-Suche machen. Dadurch musst du zwar mehrere Listen durchsuchen, musst aber kein Full-Scan der Gesamtliste machen.
Ist die ganze Nummer bekannt, musst du nur noch in einem Block suchen, was ebenfalls ein Geschwindigkeitsvorteil sein sollte.
Das einzige, was langsamer sein wird, ist das Einlesen der Daten. Aber das sollte eigentlich auch nur am Anfang einmal gemacht werden. Oder ändert sich die Liste ständig?
zuma - Mo 03.11.08 13:00
Ich würde stattdessen ein Clientdataset nutzen.
Suchen(locate auf gewünschtes Feld) und Sortieren geht da recht fix.
Ähnlichkeitssuche kann man da prima mit Filtern machen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!