Hallo Jens!
Da sich bislang ja noch keiner gefunden hat der so richtig Bescheid weiß hier mal ein paar Ideen von mir dazu:
- assoziative Arrays
Könnte es sein, daß die assoziativen Arrays viel mehr Platz verbrauchen, als "normale" Arrays?
In PHP sind AFAIK alle Arrays assoziativ, es ist also egal ob sie fortlaufend numerisch, numerisch oder alphanumerisch abgelegt werden. Der unterschied besteht dann nur im Speicherbedarf für den Schlüssel selbst.
- Verschachtelung der mehrdimensionalen Arrays
Könnte es sein, daß die verschachtelung der Arrays als solche eine Rolle spielt?
Für jedes 'neue' Array ist eine neue Verwaltungsinformation zum Array selbst nötig. Wenn die Arrays nicht nicht nur ein paar Elemente haben sollte das keine Rolle spielen.
Ganz viele Arrays mit jeweils ganz wenig Elementen kann ein Problem sein, pro Array ist ja die Hashtabelle, eine Schlüsseltabelle und eine Tabelle für die Inhalte nötig. Da dürfte einiges zusammenkommen.
- Objekte als "value" in Arrays
Könnte es sein, daß es überhaupt ungünstig ist, Objekte in Arrays zu stecken?
Da besteht eigentlich kein Grund zu.
- Referenzen
Ist die hohe Zahl von Referenzen, die z.B. durch die parent-child-Beziehung entstehen relevant?
Wäre es günstiger statt der wirklichen Abbildung eines Objektbaumes nur die "Adressen" (Arraynamen) der Objekte zu speichern?
Die Referenz sollte eigentlich die kürzeste und günstigste Form sein.
gibt es vielleicht noch mehr Fallen?
<? ???? ?>
Tja, das weiss ich auch nicht....
Eigentlich sieht das was du gemacht hast so aus, als ob es im Rahmen von PHP eine effiziente Lösung ist. Es werden immer nur alle benötigten Objekte angelegt.
Der Speicherverbrauch vom 'Baum' selber ist ebenfalls ok. Jeder Ast hat nur einen Array-Eintrag.
Bleibt also die Menge der Array Einträge gesammt, die Menge der Objekte gesammt, die Menge der Arrays und die Grösse der Hashes.
In welcher Grössenordnung liegt denn das so?
Den fettesten Speicher-Verbrauch dürften viele fast leere Arrays haben, da würde etwas ähnliches wie deine Variante 3 Abhilfe schaffen: $root->obj[xyz_abc_bnm] = new Klasse_1();
Jetzt hast du nur noch ein Array, d.h. der 'pro Array' Aufwand fällt nur einmal an.
Gruss,
Carsten