@Warrangie
Нет

Как сократить используемую память при обработке большого XML-файла?

Данный код формирует из XML файла SQL запрос.
$data=file_get_contents($uploads.$filename);
		$xmlf=new SimpleXMLElement($data);
		$g_table='SET NAMES "utf8";';
		$g_table.='INSERT INTO groups (group_id,group_name) VALUES ';
		foreach ($xmlf->gr as $group) {
			$g_table.='('.$group['group_id'].','.$group['group_name'].'),';
		}
		$g_table=rtrim($g_table,',');
		$g_table.='ON DUPLICATE KEY UPDATE group_id=VALUES(group_id),group_name=VALUES(group_name)';
		$g_table_file=fopen('sqlfiles/groups.sql','w');
		$file_bool['g_table']['file']=fwrite($g_table_file,$g_table);
		fclose($g_table_file);
		$file_bool['g_table']['query']=$this->query($g_table);
		unset($g_table);
		unset($g_table_file);
		unset($xmlf->gr);

Аналогичная конструкция используется и для других таблиц.
XML выглядит так:
<Main>
<!--- ~200 строк -->
<gr group_id="101" group_dependence="0" group_name="Группа такая-то" group_description="''"/>
<!--- ~11000 строк -->
<gp group_id="1897" ppl_name="Иванов Иван Иваныч" tgl="5"/>
<!--- Еще ~30к строк с различными именами и параметрами -->
</Main>

Почему все в одном родительском узле? Проще и быстрее доступ с помощью SimpleXML.
Почему такой хреновый код, ведь можно было сделать один блок, который будет генерировать весь код? Потому что это временно, хотя нет ничего более постоянного, чем что-то временное.

Данная конструкция кушает очень много памяти, а разделять один xml на несколько, в последствии их отдельно обрабатывать - не вариант.
Собственно вопрос: можно ли обработать xml так, чтоб единомоментно мне не понадобилось over9000 памяти? Или все же придется увеличивать лимит? Увеличивать лимит не хочу не просто из-за того, что не хочется, а потому что кажется что если мне нужно его увеличивать, то я что-то делаю не так и можно сделать лучше.
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 4
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Однако если его разбить и выполнять в одном скрипте, может случится так, что памяти не хватит.

А очищать переменные не пробовали после использования?
Ответ написан
Запрос в студию и поставьте его в цикл например
Ответ написан
@maxtm
Make money, not job
Однако если его разбить и выполнять в одном скрипте, может случится так, что памяти не хватит.

Если вы его разобьете, то чего вдруг не хватит то?
Подберите размер запроса такой, чтобы хватало.
Ответ написан
Комментировать
Господи, да опишите конкретно задачу и входные данные)+код решений
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы