XSLTProcessor xmlSAX2Characters: вне памяти

У меня есть страница, на которой загружается файл размером 500 МБ xml и анализируется файл с использованием шаблона xsl. Парсер отлично работает в моей локальной среде. Я использую WAMP.

На веб-сервере.

Предупреждение: DOMDocument :: load () [domdocument.load]: (null) xmlSAX2Characters: вне памяти в /home/mydomain/public_html/xslt/largeFile.xml, строка: 2031052 в / home / mydomain / public_html / xslt / parser_large .php в строке 6

Мой код выглядит так: строка 6 загружает xml-файл

<?php
$xslDoc = new DOMDocument();
$xslDoc->load("template.xslt");

$xmlDoc = new DOMDocument();
$xmlDoc->load("largeFile.xml");

$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
?>

Я попытался скопировать файл php.ini из установки wamp в папку, где находится вышеприведенный код. Но это не помогло. Предел памяти в этом файле php.ini равен memory_limit = 1000M

Любые советы / опыт по этому вопросу будут высоко оценены

Solutions Collecting From Web of "XSLTProcessor xmlSAX2Characters: вне памяти"

Вот грустная правда. Существует два основных способа работы с XML, основанный на DOM, где весь XML-файл присутствует в памяти сразу (со значительными накладными расходами, чтобы ускорить его перемещение) и SAX, на котором файл проходит через память, но только небольшая его часть присутствует в любой момент времени.

Однако с DOM большое потребление памяти в значительной степени нормальное.

Теперь язык XSLT в целом позволяет конструкциям, которые в любой момент могут получить доступ к любым частям всего файла, и поэтому он требует стиля DOM. Некоторые языки программирования имеют библиотеки, которые позволяют подавать вход SAX в XSLT-процессор, но это обязательно подразумевает ограничения на использование языка XSLT или памяти не намного лучше, чем у DOM. Однако PHP не имеет возможности делать XSLT-чтение SAX-входа.

Это оставляет нам альтернативы DOM; есть один и называется SimpleXML. SimpleXML немного сложно использовать, если ваш документ имеет пространства имен. Старинный бенчмарк, кажется, указывает, что он несколько быстрее и, вероятно, также менее расточительно с потреблением памяти, чем DOM на больших файлах.

И, наконец, я был на твоем месте один раз на другом языке программирования. Решение заключалось в том, чтобы разделить документ на небольшие, основанные на простых правилах. Каждый небольшой документ содержал заголовок, скопированный из всего документа, один элемент «detail» и нижний колонтитул, что делает его формат действительным для схемы большого XML-файла. Он обрабатывался с использованием XSLT (при условии, что обработка одного элемента детали не рассматривается в каком-либо другом детальном элементе), а выходы объединены. Это работает как шарм, но не выполняется в секундах.

Итак, вот ваши варианты. Выбери один.

  • Разбирайте и обрабатывайте XML с помощью SAX .
  • Используйте SimpleXML и надейтесь, что он позволит немного увеличить файлы в одной и той же памяти.
  • Выполните внешний XSLT-процессор и надейтесь, что он позволит немного увеличить файлы в одной и той же памяти.
  • Разделите и объедините XML с помощью этого метода и примените XSLT только для небольших фрагментов. Этот метод применим только с некоторыми схемами.