ID-Kombination in Array auf schnellstmöglichem Weg

02/10/2011 - 20:05 von Hermie | Report spam
Hallo!

Ich habe folgende Daten:

Eine X-Position, eine Y-Position und einen dazugehörigen Wert für diesen
X-Y-Ort.
Das sieht dann ungefàhr so aus:

X Y Wert
1343 938234 0.0008323
1424 938471 0.71193
8232 189823 0.032
9932 9933 0.932
9992 9992 0.003113
10113 9 0.0088831
150130 1932 0.088371

Diese Werte habe ich so in einer Datenbank gespeichert.
Wenn ich jetzt den Wert für z. B. X24, Y“8471 haben will, rufe ich
das über eine "SELECT wert FROM mytable WHERE x24 AND y“8471" ab.

Das ist aber nicht praktikabel, da viel zu langsam, weil ich mehrere
tausend dieser Werte schnell abrufen muss.

Ich habe auch schon versucht, das Ganze in ein Array zu packen, so dass
ich einfach sagen kann

dim dblWert as double
dblWert = myArr(1424, 938471)

Das geht aber nicht, weil VB mit der Arraygröße nicht zurechtkommt.
Im schlimmsten Fall wàre das Array nàmlich myArr(150130,160000) Felder groß.

Als nàchstes habe ich es über ein Array aus UDTs versucht, das ich dann
so lange durchlaufe, bis X und Y gefunden wurden:

Dim l&
For l = 1 To UBound(myUDTArr)
If myUDTArr(l).X = x Then
If myUDTArr(l).Y = y Then
dblWert = myUDTArr(l).Wert
Exit For
End If
End If
Next l

Das ist aber auch zu langsam.

Hat jemand noch eine Idee, wie man sowas am besten macht?

Danke!

Hermie
 

Lesen sie die antworten

#1 Thorsten Albers
02/10/2011 - 23:21 | Warnen spam
Hermie schrieb im Beitrag
<j6a95m$s2n$...
Eine X-Position, eine Y-Position und einen dazugehörigen Wert für diesen
X-Y-Ort.
Das sieht dann ungefàhr so aus:

X Y Wert
1343 938234 0.0008323
1424 938471 0.71193
8232 189823 0.032
9932 9933 0.932
9992 9992 0.003113
10113 9 0.0088831
150130 1932 0.088371

Als nàchstes habe ich es über ein Array aus UDTs versucht, das ich dann
so lange durchlaufe, bis X und Y gefunden wurden:

Dim l&
For l = 1 To UBound(myUDTArr)
If myUDTArr(l).X = x Then
If myUDTArr(l).Y = y Then
dblWert = myUDTArr(l).Wert
Exit For
End If
End If
Next l

Das ist aber auch zu langsam.



Zunàchst einmal wàre ein Hauptzugriffswert zu definieren. Ich vermute, Du
hast dafür schon den X-Wert gewàhlt, denn Deinem Beispiel nach scheinst Du
nach X-Werten aufsteigend sortiert zu haben.

Um den Zugriff zu beschleunigen, könntest Du ein weiteres Array B
verwenden, daß den Beginn eines Wertebereiches einem Index im Array A
zuordnet, d.h. dazu dient, Array A in Segmenten durchlaufen zu können, d.h.
eine 'Nachschlagetabelle'. Wie die Segmentgröße am besten aussehen sollte,
ist abhàngig vom größten möglichen Hauptzugriffswert - hier dann X. Die
Segmentgröße sollte nicht zu groß sein wegen des zusàtzlichen
Speicherplatzverbrauches, aber auch nicht zu klein, weil man es sich sonst
gleich sparen könnte - hier hilft wohl nur experimentieren sowie eine
genauere Analyse der Daten. Wàre 150.230 der größte mögliche Wert, könnte
man z.B. nach 1000ern segmentieren, das wàren dann, wenn mich meine
mathematische Unfàhigkeit nicht trügt, 150 - 1 Elemente in Array B, was
vielleicht ein bischen viel sein könnte, aber es soll ja nur als Beispiel
dienen.
Schematisch:

Array A Array B
Index X-Wert Index Wert
0 0 0 0 eigtl. überflüssig
... ...
n1 999
n1+1 1000 1 n1+1
... ...
n2 1999
n2+1 2000 2 n2+1
... ... ... ...
n3 149.999
n3+1 150.000 150 n3+1
... ... ... ...
nMax 150.230


Wenn Du jetzt den Y- und den Bruch-Werte für X‚32 suchst:
IndexB = X \ 1000 ' wichtig '\', nicht '/'
IndexA1 = B(IndexB)
IndexA2 = B(IndexB + 1) - 1

-> durchsuche A(IndexA1) bis A(IndexA2)

Besser wàre es jedoch, als Segmentgröße ein Vielfaches von 16 und nicht von
10 zu nehmen, da dann bei der Division weniger Prozessorzeit benötigt wird
(in diesem Fall sollten bei der Übersetzung des VB-Codes in Maschinencode
automatisch die dafür vorgesehen Prozessorbefehle verwendet werden, in
diesem Fall der Befehl, mit dem alle Bits des Wertes um eine bestimmte
Anzahl von Bits nach rechts verschoben werden, was einer mehrfachen
Division durch 2 entspricht).

Thorsten Albers

gudea at gmx.de

Ähnliche fragen