Hallo.
Ich habe ein paar Fragen zur Optimierung des Speicherplatzbedarfs eines PHP-Scripts.
Ich wäre sehr froh, wenn mir die PHP-Spezies unter Euch ein paar Tips geben könnten.
Ich habe ein Script geschrieben, das augenscheinlich zu viel Speicherplatz verbraucht.
Jetzt würde ich es gerne optimieren, weiß aber noch nicht genau, wo ich am besten anfange.
Daher hier ein paar Details.
Ich habe eine Baumstruktur entwickelt, in der sich viele Objekte befinden, die in einer parent-child-Beziehung zueinander stehen.
Das ganze will ich mal kurz schematisch beschreiben.
Alles beginnt mit einem root-Objekt:
<?
$root = new rootobj();
?>
Darunter befinden sich in mehrdimensionalen assoziativen Arrays Objekte verschiedener Klassen nach folgendem Muster:
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
$root->obj['xyz']['mno']['jkl'] = new Klasse_2();
$root->obj['asd']['qwe']['mno'] = new Klasse_3();
u.s.w.
?>
Diese Objekte haben auch wieder untergeordnete Objekte:
<?
$root->obj['xyz']['abc'][1]->obj['sdf']['yxc']['xcv'] = new Klasse_4();
$root->obj['xyz']['abc'][1]->obj['wer']['xcv']['qwe'] = new Klasse_5();
u.s.w.
?>
Das ganze kann sich auch noch tiefer verschachteln.
z.B.
<?
$root->obj['xyz']['abc'][1]->obj['wer']['xcv']['qwe']->obj['rtz']['tzu']['zui'] = new Klasse_6();
?>
Damit die untergeordneten Objekte ihr Parent-Objekt kennen, haben diese alle noch Referenzen auf das Parent-Objekt:
z.B:
<?
$root->obj['xyz']['abc'][1]->obj['sdf']['yxc']['xcv']->parent = &$root->obj['xyz']['abc'][1];
?>
Auch kann es weitere Referenzen auf Objekte in dem Baum geben, die sich in einem ganz anderen Zweig befinden:
z.B.
<?
$root->obj['xyz']['abc'][1]->obj['sdf']['yxc']['xcv']->referenzwoandershin =
&$root->obj['xyz']['abc'][1]->obj['wer']['xcv']['qwe'];
?>
Wenn nun dieser Baum so richtig dick wird, weil viele Objekte definiert sind, dann wird das ganze sehr speicherintensiv und langsam.
Jetzt meine Überlegungen, womit das zu tun haben könnte:
-
assoziative Arrays
Könnte es sein, daß die assoziativen Arrays viel mehr Platz verbrauchen, als "normale" Arrays?
Wäre es also günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj[1][3][5] = new Klasse_1();
?
zu wählen?
(Und muß man dabei darauf achten, daß in jeder Dimension von 0,1,2... beginnend alle Zahlen vertreten sind, oder geht auch z.B. 5,34,623...) -
Verschachtelung der mehrdimensionalen Arrays
Könnte es sein, daß die verschachtelung der Arrays als solche eine Rolle spielt?
Wäre es günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj['xyz_abc_bnm'] = new Klasse_1();
?>
zu wählen? -
Objekte als "value" in Arrays
Könnte es sein, daß es überhaupt ungünstig ist, Objekte in Arrays zu stecken?
Wäre es günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj_xyz_abc_bnm = new Klasse_1();
?>
zu wählen? -
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?
Also statt
<?
$root->obj['xyz']['abc'][1]->obj['sdf']['yxc']['xcv'] = new Klasse_4();
?>
lieber
<?
$root->obj['xyz']['abc'][1] = new Klasse_1();
$root->obj['sdf']['yxc']['xcv'] = new Klasse_4();
$root->obj['xyz']['abc'][1]->child = 'sdf_yxc_xcv';
$root->obj['sdf']['yxc']['xcv']->parent = 'xyz_abc_1';
(oder so ähnlich)
?> -
Verschachtelung von Objekten
Durch die Nutzung von $root und Unterordnung aller Objekte unter dieses Rootobjekt kann ich durch
<?
global $root;
?>
in allen Funktionen auf alle vorhandenen Objekte zugreifen. Das ist recht günstig.
Ist es aber vielleicht trotzdem besser, auf $root zu verzichten und Objekte im allgemeinen Namensraum zu definieren?
Es könnte ja z.B. sein, daß mit jedem
<?
global $root;
?>
der ganze Baum wieder innerhalb der Funktion noch einmal erzeugt wird.
Wäre es also günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
$root->obj['xyz']['mno']['jkl'] = new Klasse_2();
$root->obj['asd']['qwe']['mno'] = new Klasse_3();
?>
lieber die Variante
<?
$obj['xyz']['abc']['bnm'] = new Klasse_1();
$obj['xyz']['mno']['jkl'] = new Klasse_2();
$obj['asd']['qwe']['mno'] = new Klasse_3();
?>
zu wählen und dann innerhalb einer Funktion z.B. mit
<?
global $obj['xyz']['abc']['bnm'];
global $obj['xyz']['mno']['jkl'];
?>
die benötigten Objekte direkt anzusteuern?
gibt es vielleicht noch mehr Fallen?
<? ???? ?>
Wer bis hierhin durchgehalten hat: DANKE DANKE DANKE!
Wenn ich jetzt wissen würde, ob ich auf dem richtigen Weg bin - und wo ich anfange...
Wenn jemand Erfahrung mit solchen Problemen hat, wären ein paar Hinweise und Ergänzungen super.
Vielen Dank und viele Grüße
Jens Hopp