AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Muss viele Strings vergleichen. Geschwindigkeit...
Thema durchsuchen
Ansicht
Themen-Optionen

Muss viele Strings vergleichen. Geschwindigkeit...

Ein Thema von DelTurbo · begonnen am 14. Jul 2017 · letzter Beitrag vom 14. Jul 2017
Antwort Antwort
Seite 1 von 3  1 23      
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.212 Beiträge
 
Delphi 2007 Architect
 
#1

Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 11:27
Hallo,
ich habe ein kleines Problem. Ich habe bis zu 2.000.000 Produkte in CSVDateien. Dort stehen Bestellnummern drin. Bestellnummern die mehrmals vorkommen muss ich zählen. Die Bestellnummern sind 10 Zeichen lang.

Da die Bestellnummern nur 10 Zeichen haben habe ich die in einer TStringlist. Das ist wesentlich schneller als THashedStringList habe ich festgestellt.

Nun zu meinem Problem. Je mehr Bestellnummern ich in der TStringlist habe um so langsamer wird das ganze. Ist ja auch logisch.

Ich Frage mit .IndexOf ob es die Bestellnummer schon gibt. Wenn nicht adde ich die. Hat vielleicht jemand eine andere Idee wie ich schneller abfragen könnte ob es die Nummer schon gibt?

Vielen dank im Voraus
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 11:34
Mit THashedStringList sollte ein IndexOf eigentlich schneller sein.
Falls du zufällig doch eine neuere Version als Delphi 2007 benutzt gäbe es da auch noch TDictionary<string, string> (bzw. <string, irgendwas>)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 11:49
Hast du bei der Stringlist nach dem Create Sorted auf true gesetzt? Wenn du dann noch Duplicates auf dupIgnore setzt, dann kannst du dir die Abfrage auf IndexOf auch sparen, da bei einem Add nur ein noch nicht vorhandener String zugefügt wird.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#4

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 12:30
Jupp, wenn StringList sortiert ist, dann nutzt IndexOf eine "optimierte" Suchfunktion,
wenn nicht, dann wird im Worst-Case jedes mal die komplette Liste durchgegangen (jeder einzelne String verglichen).

Mit eine Hashed-StringList muß nur nach dem Hash (Integer) gesucht werden, anstatt alle Strings als Byteweise zu vergleichen.

Das Dictinary ist erstmal sortiert und nutzt auch noch Hashs. (die Hashs sind natürlich sortiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 12:31
Wir haben BTree-Implementierung im Einsatz die uns genau solche Suchen extrem beschleunigt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 12:41
Hast du bei der Stringlist nach dem Create Sorted auf true gesetzt? Wenn du dann noch Duplicates auf dupIgnore setzt, dann kannst du dir die Abfrage auf IndexOf auch sparen, da bei einem Add nur ein noch nicht vorhandener String zugefügt wird.
Er will ja gerade wissen, OB der Eintrag schon in der Liste war/ist.


Du könntest die TStringList sortieren und auf dupError setzen. Beim Add fängst du den Fehler ab und weißt, ob der Eintrag schon in der Liste war oder nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#7

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 13:14
Add macht intern auch ein IndexOf (außer bei dupAccept und wenn nicht sortiert, wo er nicht zu prüfen/suchen braucht)

Das Tempo des IndexOf steckt also auch im Add drin.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.444 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 13:18
Aus meiner Sicht eindeutig: versuche es erst mal mit einem TDictionary<>. Ist wirklich "Delphi 2007 Architect" deine letzte Version? Bestell dir eine neuere oder such dir einen anderen Job.
BTree geht auch, ist aber nicht "out of the Box". Falls doch: auch ich habe auch eine Implementierung incl. hausinternen unit test.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 13:35
Bestell dir eine neuere oder such dir einen anderen Job.
Also bitte? Was ist das denn für ein abartiger Kommentar? Man kann sich seine Werkzeuge eben nicht in jedem Projekt frei aussuchen. Du wirst das erkennen, sobald Du selbst ein wenig Lebens- und Praxiserfahrung gesammelt hast. Bis dahin wird man wohl nachsichtig mit Dir sein müssen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#10

AW: Muss viele Strings vergleichen. Geschwindigkeit...

  Alt 14. Jul 2017, 13:37
Er will ja gerade wissen, OB der Eintrag schon in der Liste war/ist.
Na ja, er will das wissen, um zu entscheiden, ob er den Eintrag hinzufügen soll oder nicht. Mit dupIgnore erübrigt sich das eben. Das macht intern nämlich genau das.

Ich Frage mit .IndexOf ob es die Bestellnummer schon gibt. Wenn nicht adde ich die.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 04:27 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