@80689248440

Как закрыть/выгрузить из памяти данные XMLReader()?

Есть парсер - вот кусочек чтоб было понятно что нужно выгрузить
$strnSQL = "SELECT * FROM _posts";	
$rn = mysql_query($strnSQL);
while($rown = mysql_fetch_array($rn)){
	
		$nxml = new XMLReader();
		$nxml->open('../xml/import.xml'); // начинает нехватать памяти
			while($nxml->read() && $nxml->name !== 'offer');
				while($nxml->name === 'offer'){
					$n_node = new SimpleXMLElement($nxml->readOuterXML());
					$n_id = "" . $nxml->getAttribute("id");							

					$nxml->next('offer');
				}			
		$nxml->close();
		unset($nxml);
	}

всё это дело естественно имеет много интераций и через некоторое время заканчивается память.
Я пока не умею нормально работать с памятью и понимать что там за процессы происходят но чувствую что $nxml хоть и перезаписывает сам себя и стоит unset($nxml); но память не освобождается.
Как сделать чтоб на каждом круге полностью сбрасывалась оперативная память которая была занята открытым файлом?
Выход примерно такой но как перемещаться в начало?
$rn = mysql_query($strnSQL);

		$nxml = new XMLReader();
		$nxml->open('../xml/import.xml');
		
while($rown = mysql_fetch_array($rn)){
	
			#$nxml->moveToFirstAttribute(); как заставить эту штуку работать чтоб чтение начиналось сначала 
			while($nxml->read() && $nxml->name !== 'offer');
				while($nxml->name === 'offer'){
					$n_node = new SimpleXMLElement($nxml->readOuterXML());
					$n_id = "" . $nxml->getAttribute("id");					

					$nxml->next('offer');
				}
}
  • Вопрос задан
  • 631 просмотр
Пригласить эксперта
Ответы на вопрос 3
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Не знаю зачем вам перемещаться назад, если вам нужно прочитать XML

Я XmlReader+SimpleXML читал YML яндекса по 1-2гб.
Ответ написан
@Fortop
Tech/Team lead
Для начала нужно определиться с тем, кто кушает память.

Поэтому прописываем запись в лог memory_get_usage() в конце каждого из циклов с указанием для какого именно цикла эта информация.

Затем, после падения, анализируем лог и смотрим, кто даёт утечку.
Ответ написан
@80689248440 Автор вопроса
Решение кроется в том чтоб мне вернуться на начало документа так как в
while($nxml->read() && $nxml->name !== 'offer');
Мы опускаемся всё ниже и ниже, а вот как вернуть курсор на начало документа не знаю способа кроме как открыть его заново.
Пробовал:
moveToAttribute
moveToAttributeNo
moveToAttributeNs
moveToElement
moveToFirstAttribute
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы