Hi Sven,
Nur so als Beispiel nehmen wir mal ein Integer-Array:
Jeder Wert belegt 4 Byte.
Ein Array 1..100 belegt also 400 Byte. Billig.
Ein Array 1..100,1..100 belegt schon 100x100x4 Byte, also 40000 Byte.
Ein Array 1..100,1..100,1..100 belegt 4.000.000 Byte, ungefähr 4 Megabyte.
Wie sicher bist Du Dir, daß PHP intern genau so arbeitet?
Ich kenne einige Sprachen, die das tun würden.
Perl gehört meines Wissens allerdings nicht dazu - soweit ich gehört habe,
werden dort auch Arrays zunächst einmal dynamisch angelegt.
Der tatsächliche Platzbedarf hängt möglicherweise in hohem Maße davon ab,
wieviele verschiedene Elemente tatsächlich benötigt werden.
Wenn der Array beispielsweise nur jedes 3. Element pro Dimension wirklich
umfassen soll, dann sinkt der Speicherbedarf möglicherweise um Faktor
3^(Anzahl Dimensionen) - nämlich dann, wenn der Array als Liste mit
zusätzlicher Adressierungs-Infrastruktur realisiert ist.
Man kann einen Array durchaus auch als Baum realisieren, wenn man bereit
ist, den gesparten Platz mit etwas langsameren Zugriffen zu bezahlen.
1 Mio x 1 Mio x 1 Mio x 4 Byte sind nach Adam Riese die schlappe Größe von
4.000.000.000.000.000.000 Byte. Oder auch 4 Trillionen Byte. Oder (ungefähr
gerundet) 4 Millionen Terabyte!
Natürlich nur, wenn du wirklich für jeden Index echt einhundert Werte hast.
Oder wenn das Laufzeitsystem den Platz dafür bereit stellt. Dies hängt
aber sehr stark von der Arbeitsweise des entsprechenden Interpreters ab.
Macht aber deutlich, daß du durch dein Verschachteln bis in die dritte
Ebene von jeweils dreidimensionalen Arrays oder Hashes ziemlich schnell
in Probleme geraten wirst, weil zumindest die Verwaltungsinformationen
für die Hashes sich mit x^9 explosionsartig im Speicher breitmachen.
Den grundsätzlichen Ausführungen schließe ich mich natürlich vollumfänglich
an. ;-)
Mir scheint, du solltest dein Konzept grundlegend ändern. :)
Wobei die Idee, Dimensionen zusammenzufalten, mir spontan am erfolgverspre-
chendsten erscheint.
Dabei ist das Konkatenieren der Teil-Indizes zu einem komplexen Gesamt-Index
pro Objekt-Ebene durchaus ein gangbarer Weg.
Eine andere Idee wäre die Verwendung einer Hash-Funktion, um diese komplexen
Indexe auf etwas vergleichsweise Triviales (etwa integer) abzubilden, wobei
dann mit diesen Integern ein Array adressiert werden kann, der Platz in der
Größenordnung des tatsächlichen Netto-Bedarfs zur Verfügung stellt.
Perl (und wohl auch PHP?) stellen dies dann sogar direkt als Sprachelement
zur Verfügung (wobei dessen Verwendung dann Vertrauen in die entsprechende
Implementierung bedeutet ;-), in C müßte man es selbst programmieren.
Viele Grüße
Michael