Autor |
Beitrag |
zongo-joe
      
Beiträge: 134
win xp prof
D3, D4, D7
|
Verfasst: Fr 31.10.08 15:50
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
      
Beiträge: 53
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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?
_________________ We are, we were and will not be.
|
|
zongo-joe 
      
Beiträge: 134
win xp prof
D3, D4, D7
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 31.10.08 22:55
Ne hashmap oder eine kleine Access-DB.
_________________ Na denn, dann. Bis dann, denn.
|
|
zongo-joe 
      
Beiträge: 134
win xp prof
D3, D4, D7
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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.
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|