Ich persönlich würde so auch sagen, dass du die Daten am Besten in einem 2 Dimensionalem Array ablegst und dann entsprechend in der dritten Dimension dann lediglich eine Liste der Elemente für diese Stelle beinhält.
Eine alternative zu einem 4Byte Integer wäre zum Beispiel ein 2 Byte Integer (ja auch so etwas gibt es).
Also entweder ein DWord oder Smallint. Dann hätte man keinen so großen Verwaltungsaufwand. Keinen so großen Speicherverschmiss und man könnte die Dimensionen auf 64000^3 erweitern. Für den Fall, dass aber 1024 das absolute Maximum für die Matrixgröße wäre würde ich auch vorschlagen, dass du nur ein 4Byte integer benutzt. Das extrahieren ist zwar ein wenig Komplizierter als ein Integer abfragen aber noch keines Wegs so kompliziert.
Das kann man mit den Operatoren
and und
shr sehr einfach und schnell lösen.
Shr rotiert eine Zahl um die angegebene anzahl an Bits. Und
and lässt nur ein bestimmtes Bitmuster durch. $3FF = 1023. Also die ersten 10 Bits.
Delphi-Quelltext
1: 2: 3:
| X := Wert and $3FF; Y := Wert shr 10 and $3FF; Z := Wert shr 20 and $3FF; |
Zusammenbauen würde so gehen.
shl rotiert auch aber nach links.
Delphi-Quelltext
1:
| Wert := (Z shl 20) or (Y shl 10) or X; |
PS: Bei solchen Datenmengen wäre es vielleicht sogar eine Überlegung wert ob es nicht sinnvoller ist die Daten gleich in die Datenbank zu schreiben? Eine Datenbank kann durch diverse Indizes schon einiges optimieren. Aber die Daten wären halt komplett auf der Festeplatte gespeichert. Das würde allerdings nur funktionieren, wenn du nicht so häufig auf die Daten zugreifen musst. Sonst schlägt sich das negativ in der Geschwindigkeit nieder.
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.