2016-07-22 13 views
0

Ich verwende SimpleXML zum Parsen einer Datei (ca. 341 MB). Nach dem Laden der Datei verbraucht es eine beträchtliche Menge an RAM, die in Ordnung ist. Mein Hauptproblem ist, dass der Speicher nicht freigegeben wird, bis der Cron austritt.SimpleXML Freier Speicher von Ladedatei

Ich nahm an, dass, wenn ich das referenzierte XML-Objekt aufheben würde, auch der für die In-Memory-Datei reservierte Speicher frei wäre, aber das ist nicht der Fall.

Ist es möglich, den Speicher für die referenzierte Datei freizugeben?

Beispiel-Code (weiß nicht, ob GC helfen kann):

gc_enable(); 
$this->xml = simplexml_load_file($filePath); 
$val = $this->getValues('/SOME/PATH/HERE'); 

foreach($val as $a) { 
    $this->tags[] = (string) $a->$tagName; 
} 

$this->xml = null; 
unset($this->xml); 
gc_collect_cycles(); 
+0

Gibt es einen weiteren Verweis auf einen Knoten des XML-Dokuments, den Sie nie deaktiviert haben (wodurch SimpleXML das gesamte Objekt im Speicher belässt)? Wenn nicht, könnte es sich nur um die Komplexität des PHP-Speichermanagers handeln. Es gibt ein gutes Gespräch hier: https://www.youtube.com/watch?v=sm1HUrnsxLI – IMSoP

+0

Keine andere Referenz, das ist der ganze Code. Es ist Teil eines Konstruktors, aber die XML-Variable befindet sich nur im Bereich des Konstruktors. – Drakoumel

Antwort

-1

Ich hatte ähnliches Problem mit ziemlich großen XML-Dateien (i von einem anderen System in Schleife importierten viele 1-5Mb XML-Dateien wurde Parsen), so i zu XMLReader bewegt und schrieb Code wie

$reader = new XMLReader(); 
$reader->open("path_to_file.xml", "UTF-8", LIBXML_NOBLANKS); 
/*do some parsing(probably you'll need iterate over nodes using next). 
* Note that if you use XMLReader then any #text nodes even 
* only containing new lines and spaces are being read 
* unless you set option LIBXML_NOBLANKS 
*/ 
$reader->close(); 

dies mindestens ausplanen von LibXML zugewiesenen Ressourcen und es viel weniger Speicher verwenden, während große Dokumentenverarbeitung.

+0

Vielen Dank für die Eingabe, aber das beantwortet meine Frage nicht. Ich kenne XMLReader, aber das Problem ist die Leistung. Das Plus von simpleXML ist die Geschwindigkeit. Es analysiert die gesamte Datei in 1 Sekunde. – Drakoumel

+0

Deaktivieren Sie jeden Knoten, den Sie in Ihrem Code verwenden (nicht nur $ xml-Objekt), wenn Sie Verweise auf sie behalten, nehme ich an, sie würden nicht freigegeben werden –