XML - Speichercheck

Alice

Erfahrenes Mitglied
Hallo.

Ich habe einen kleinen Test durchgeführt und ein unerwartetes Ergebnis erzielt. Vielleicht kann hier jemand Licht ins dunkle bringen. :)

Ich habe 2 identische PHP-Skripte. Beide Skripte laden eine XML-Datei die sich aber vom Aufbau unterscheiden.

Aufbau 1. XML (als Beispiel)
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Autos>
  <Typ01>BlaBlaBLa</Typ01>
  <Typ02>BlaBlaBLa</Typ02>
  <Typ03>BlaBlaBLa</Typ03>
  <Typ04>BlaBlaBLa</Typ04>
  <Typ05>BlaBlaBLa</Typ05>
  <Typ06>BlaBlaBLa</Typ06>
  <Typ07>BlaBlaBLa</Typ07>
  <Typ08>BlaBlaBLa</Typ08>
  <Typ09>BlaBlaBLa</Typ09>
  <Typ10>BlaBlaBLa</Typ10>
</Autos>

Aufbau 2. XML (als Beispiel)
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Autos>
  <Europa>
    <Typ01>BlaBlaBLa</Typ01>
    <Typ02>BlaBlaBLa</Typ02>
    <Typ03>BlaBlaBLa</Typ03>
    <Typ04>BlaBlaBLa</Typ04>
  </Europa>
  <Asien>
    <Typ05>BlaBlaBLa</Typ05>
    <Typ06>BlaBlaBLa</Typ06>
    <Typ07>BlaBlaBLa</Typ07>
  </Asien>
  <USA>
    <Typ08>BlaBlaBLa</Typ08>
    <Typ09>BlaBlaBLa</Typ09>
    <Typ10>BlaBlaBLa</Typ10>
  </USA>
</Autos>

Nun das "komische" Ergebnis.

1. PHP-Datei mit 1. XML:
1. Memory-Check: 1070704 Byte (Direkt am Anfang)
2. Memory-Check: 128965672 Byte (am Ende)
3. Laufzeit: 0.932988166809 Sekunden

2. PHP-Datei mit 2. XML:
1. Memory-Check: 1073144 Byte (Direkt am Anfang)
2. Memory-Check: 4359216 Byte (am Ende)
3. Laufzeit: 0.829295873642 Sekunden

Die Usprüngliche XML-Datei war wie im Beispiel Nr. 2 aufgebaut. Durch die andere Variante (1) habe ich mir eigentlich erhofft weniger Ressourcen zu verbrauchen, weil die XML-Datei eigentlich schmaler ist und "direkter" angesprochen werden kann.

Kann es sein, dass die Kategorien (Europa, Asien und USA) dafür sorgen, dass das Skript die Kategorien die nicht gebraucht werden ignoriert und somit nicht in den Speicher laden? Ich kann es mir anders überhaupt nicht erklären.
 
"Kann" schon sein, aber eine definitive Aussage kann da schwer gemacht werden. Hängt von viel zu viel Sachen ab...
 
Du könntest dich natürlich im PHP Source Code informieren: http://lxr.php.net/

Ansonsten würde ich nicht zu viel Wert auf den Speicherverbrauch (bei solch kleinen Datenmengen) legen. Bau die Datei so auf, wie es am logischsten erscheint.
 
(Im Source gibts eine simplexml.c, die braucht auch noch eine xml.c, beide zusammen haben ca. 4500 Zeilen. Wenn man sich da durcharbeiten will kann man das schon beantworten... Mir fehlt da leider die Zeit dazu.)
 
Vielleicht hast Du recht, aber das eine Skript verbraucht das 28 Fache (!) wie das andere... Wenn das Skript nur 500 mal auf Tag aufgerufen wird ist das ein 14000er Facher unterschied . Das wären 59500 MB (mehr Verbrauch) am Tag.

Wenn ich richtig liege, müsste ich die XML in viele kleine Stücke gliedern, um es noch effizienter zu machen.
 
Das kann ich mir nicht vorstellen. Kannst die du die Skripte (am besten mit der XML-Datei eingebettet als Heredoc) posten?
 
Kann ich leider noch nicht.

Die PHP-Dateien sind absolut identisch. Der einzige unterschied ist: Das eine ladet "test1.xml" und das andere "test2.xml". Die XML-Dateien unterschieden sich sehr wie im 1. Beitrag erwähnt. Der Unterschied zwischen dem Speicherverbrauch beträgt ~ 120 MB pro durchlauf. Habe ich jetzt 100 mal getestet.
 
Ich habe den "ganzen Scheiß" mal provisorisch auf MySQL umgebaut.

Speicherverbrauch:
1. XML (ohne Kategorien): ~ 122 MB (0.88 Sekunden)
2. XML (mit Kategorien): ~ 3,2 MB (0.83 Sekunden)
3. MySQL: ~ 3,8 MB (0.65 Sekunden)

Die MySQL Tabelle habe ich ganz einfach aufgebaut. Also so wie ich das mit der XML-Datei eigentlich vor hatte ganz ohne elend lange Verschaltelungen.
 
Habe das ganze nun ausführlich getestet.

Wenn man es mit XML machen möchte und wie in meinem Fall viele Daten vorhanden sind, sollte man unbedingt auf eine ausgeklügelte verschachtelung achten. Das spart eine Menge Zeit und Speicher. Die MySQL Variante hat mich noch nicht überzeugt, obwohl sie eigentlich recht Fix (schnell) ist und nur unwesentlich mehr Speicher als eine XML mit verschaltelung braucht. Dafür aber leider bis zu 15 Querys in meinem Fall.
 
Zurück