Schnellere Alternatice von Hashtable?
-
Aloha.
Irgendwie is eine Hashtable ja doch argh lansam. Da ich aber vermute, das es (bei mir) von Handgeschrieben nicht schneller wäre (wichtig is mir die überprüfung auf einen doppelten Index und eine entsprechende Exception).
Lade da daten aus einer SQL Abfrage (Ich bin nich derjenige, der diese blöde Datenbank verantwortlich is. Die sind dort nicht Indiziert und so stehen dort Doppelte einträge drin, die ich im Programmcode rausfiltern muss.) Das sind etwa 11k Einträge. Das ganze dauert so etwa 25-30 sekunden.Gibt es da irgendwie eine Schnellere Methode?
Vielleicht weiss da ja jemand Rat.
Danke schonmal im Voraus
-
Hast du denn sichergestellt, dass gerade die Hashtable wirklich der Flaschenhals ist? Es liegt ja fast nahe zu vermuten, dass 11k Einträge lesen auch nicht gerade schnell ist...
-
Bei SQL gibt es das Zusatzwort: "Distinct" ( http://www.sql-tutorial.com/sql-distinct-sql-tutorial/ ) inwieweit das bei Deinen Daten hilft kann ich ohne Kenntnis der Daten natürlich nicht sagen.
Hashtables an sich sind nicht langsam, das Problem liegt eher in der Hash-Funktion des Key-Objects selbst. Am ehesten kann man an der Stelle vielleicht etwas machen.
Ansonsten solltest Du zuerst mal einen Profiler laufen lassen um zu schauen wo denn tatsächlich der Flaschenhals liegt, vielleicht ist es ja auch was ganz anderes als Du denkst.
-
Egal ob die Daten indiziert sind oder nicht ist das eine Aufgabe die ich den SQL Server machen lassen würde.
Wenns dann langsam ist dann sollen sich die Leute die für die DB verantwortlich sind eben Gedanken machen.Und ja, ein Hashtable ist für die meisten Dinge wofür man ihn verwenden kann so ziemlich das schnellste wo gibt -- weiss nicht wie du auf so abstruse Ideen kommst.
Und ... für 11k Rows 30 Sekunden? WTF? Das ist VIEL zu langsam.
-
Zeigt einmal die Spalten der Tabelle und 2 Rows.
Da lässt sich sicher was mit einem SQL-Query machen.
-
Hallöchen.
Danke schonmal für die Antworten.
Auf jedenfall ist die Hashtable der Flaschenhals. Wenn ich das das hinzufügen auskommentiere durchlaufe ich die einträge in 2-3 sekunden.
Die Sache mit dem Distinct...
Das Problem daran is, das ich quasi eine Art Statistik über die Daten erstellen soll. Entsprechend sollen auch "Fehler" gezählt werden. Fehler wären doppelte Einträge. Diese bekomme ich derzeit zusammen, indem ich die entsprechende Exception beim hinzufügen abfange und darauf reagiere.Was mir als Idee gekommen ist, tatsächlich ein select Distinct zu machen, das ganze ohne Hasttable zu speichern (einfach in zwei unterschiedlichen Arrays), die Anzahl der Zeilen speichere und dannach ein count auf alle einträge mache und die differenz als Fehler speichere...
Sollte im Prinzip auf das selbe hinauslaufen, ist aber evtl doch schneller.
Habe allerdings erstmal urlaub, weswegen ich das ganze jetzt nicht testen kann.Danke aber auf jedenfall für die Anregungen.
Gruß,
Kerl
-
Kerl schrieb:
... Fehler wären doppelte Einträge. Diese bekomme ich derzeit zusammen, indem ich die entsprechende Exception beim hinzufügen abfange und darauf reagiere.
Ich kann zwar kein C#, aber mich würde es wundern, wenn die Hashtable keine "contains" Methode hat. Das Erzeugen und Fangen von Exceptions brauch normal viel länger, als ne Methode mit rückgabewert. Sonst kanns nur an ner schlechen Hashfunktion liegen.
-
Achte jedenfalls darauf, die generische Version zu verwenden (Dictionary<TKey, TValue>). Ich weiß nicht genau was du in die Hashtable tust, wenn es sowas wie ein int ist, würde es sonst ständig geboxt. Das ist natürlich schon langsam.
-
Kerl schrieb:
Diese bekomme ich derzeit zusammen, indem ich die entsprechende Exception beim hinzufügen abfange und darauf reagiere.
Zeig mal die Codestelle
Ich denke auch das hier der Fehler ist. Exceptions sollten grundsätzlich nicht als "normaler" Programmablauf benutzt werden, so wie dud as andeutest. Tatsächlich solltest Du statt dessen mit Contains() checken ob der eintrag bereits vorhanden ist.
-
Ich vermute auch, dass das Problem die Exceptions sind. Sobald du in eine solche Ausnahmesituation kommst kannst du auch keine Geschwindigkeit mehr erwarten.
-
Naja ... lässt sich auch mit GROUP BY lösen, das mit den Duplikaten.
Ist zwar etwas brutal, aber wenn duSELECT a, b, c, COUNT(*) FROM x ... GROUP BY a, b, c
machst dann weisst du sogar pro Zeile wie viele Duplikate es gegeben hat.
Für den SQL Server sollte das nicht viel schlimmer sein als wenn du gleich ein SELECT DISTINCT machst.
-
Tatsache. Contains hat tatsächlich geholfen. Ist doch deutlich schneller als voeher!
Ob ich was mit dem group by anfangen kann weiss ich noch nicht, damit spiel ich grad noch rum