Задать вопрос
@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 памяти? Или все же придется увеличивать лимит? Увеличивать лимит не хочу не просто из-за того, что не хочется, а потому что кажется что если мне нужно его увеличивать, то я что-то делаю не так и можно сделать лучше.
  • Вопрос задан
  • 383 просмотра
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 4
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Однако если его разбить и выполнять в одном скрипте, может случится так, что памяти не хватит.

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

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

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

Похожие вопросы
18 дек. 2024, в 13:47
1800 руб./в час
18 дек. 2024, в 13:22
30000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект