| |

Fortgeschrittene ProgrammierungRe: Doppeleintragungen sortieren | |  | Autor: Preisser | Datum: 14.10.10 17:27 |
| Hallo,
konnte meinen Beitrag leider nicht mehr editieren.
Ich hab jetzt mal einen Test der Geschwindigkeit zwischen Access-DB und VB6-UDTs gemacht. Als Datensatz verwendete ich folgende Struktur:
Public Type MyPersDatensatz
StrFeld1 As String
StrFeld2 As String
StrFeld3 As String
StrFeld4 As String
LngFeld1 As Long
End Type
Public PersDatensatzArr() As MyPersDatensatz
Public PersDatensatzIdxArr() As Long
Public PersDatensatzArrCount As Long Also ein Datensatz mit 4 Strings und einer Zahl.
Das zugehörige Array fülle ich mit 30000 Datensätzen, deren Inhalte zufällig generiert werden (Strings mit einer Länge zwischen 9 und 12 Zeichen).
Danach erstelle ich weitere 100 zufällige Datensätze, die in die Tabelle eingetragen werden sollen, aber nur, wenn kein Duplikat dieses Datensatzes in der Tabelle vorhanden ist. Das heißt, ich überprüfe vor jedem Hinzufügen des Datensatzes ins Array, ob es schon einen Datensatz mit den gleichen Daten gibt.
Hierzu wird eine binäre Suche und eine Indirektion über das PersDatensatzIdxArr-Array verwendet. Der Zugriff PersDatensatzArr(i) liefert das i-te Element in der Reihenfolge, in der die Elemente hinzugefügt wurden. Im Array PersDatensatzIdxArr werden die Indizes so gepeichert, dass die Datensätze einem bestimmten Sortierkriterium genügen.
PersDatensatzArrCount gibt die Anzahl an Datensätzen an (LBound: 0, RBound: PersDatensatzArrCount - 1).
Die Arrays haben eine Anfangsgröße von 500 und werden jeweils um 100 Einträge vergrößert, wenn mehr Datensätze benötigt werden.
Das Gleiche hab ich dann mit einer Access 2003-DB gemacht. Zuerst 30000 zufällige Datensätze hinzugefügt, dann nochmal 100 generiert, welche nur hinzugefügt wurden, wenn nicht bereits ein gleicher Datensatz in der DB vorhanden ist. Dazu hab ich bei jedem Datensatz ein SELECT-Statement benutzt, welches in der WHERE-Klausel die Werte enthält, und nur einen Eintrag hinzugefügt, wenn die Abfrage ein leeres Resultset lieferte (könnte man natürlich auch noch optimieren).
Zeitdauer bei Array aus UDTs: 110 ms
Zeitdauer bei Access 2003-DB: 3016 ms!
Allerdings waren hier die Felder nicht indiziert. Wenn man alle Felder indiziert (was zusätzlichen Speicherplatz benötigt), dauerte es mit einer Access-DB auch nur noch 150 ms.
Die Variante über ein Array aus UDTs war hier beim Suchen von Duplikaten also schneller als die Verwendung einer Access-DB. Allerdings braucht das dann natürlich entsprechend RAM (ca. 3 MB bei 30.000 Datensätzen mit Strings aus 9-12 Zeichen), und mit einer DB hat man tatsächlich auch mehr Möglichkeiten (z.B. Sortierung).
Den verwendeten Code konnte ich leider nicht mehr mit hinzufügen, da sonst die Nachricht zu lang wäre (falls das jemand intressiert, kann ich ihn ja noch schreiben).
Beitrag wurde zuletzt am 14.10.10 um 17:57:13 editiert. |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) sevOutBar 4.0 
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|