2016-07-22 3 views
0

Я использую simpleXML для анализа файла (около 341 мб). При загрузке файла он потребляет значительное количество оперативной памяти, что вполне нормально. Моя основная проблема заключается в том, что память не освобождается до выхода cron.SimpleXML Свободная память, потребляемая из файла загрузки

Я предположил, что если я отменил ссылочный объект xml, память, зарезервированная для файла в памяти, также будет выпущена, но это не так.

Можно ли освободить память для файла, на который имеется ссылка?

Пример кода (не знает, если GC может помочь):

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

Есть ли еще одна ссылка на какой-либо узел документа XML, который вы никогда не отключили (что вынуждает SimpleXML оставить все в памяти)? Если нет, это может быть случай сложностей менеджера памяти PHP. Здесь хорошо говорят: https://www.youtube.com/watch?v=sm1HUrnsxLI – IMSoP

+0

Никакой другой ссылки, это весь код. Это часть конструктора, но переменная XML находится только в области конструктора. – Drakoumel

ответ

-1

У меня были аналогичный вопрос с довольно большими файлами XML (я был разбор много 1-5Mb XML-файлов, импортированных из другой системы в цикле), поэтому я переехал в XMLReader и написал код, как

$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(); 

это, по крайней мере освобождения ресурсов, выделенных Libxml и использовать способ меньше памяти при обработке большого документа.

+0

Спасибо за ввод, но это не отвечает на мой вопрос. Я знаю XMLReader, но проблема в производительности. Плюсом simpleXML является скорость. Он анализирует весь файл за 1 секунду. – Drakoumel

+0

Вы отключили каждый узел, который используете в своем коде (а не только объект $ xml), если вы держите ссылки на них, я думаю, они не будут освобождены –

Смежные вопросы