У меня есть страница, на которой загружается файл размером 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
Любые советы / опыт по этому вопросу будут высоко оценены
Вот грустная правда. Существует два основных способа работы с XML, основанный на DOM, где весь XML-файл присутствует в памяти сразу (со значительными накладными расходами, чтобы ускорить его перемещение) и SAX, на котором файл проходит через память, но только небольшая его часть присутствует в любой момент времени.
Однако с DOM большое потребление памяти в значительной степени нормальное.
Теперь язык XSLT в целом позволяет конструкциям, которые в любой момент могут получить доступ к любым частям всего файла, и поэтому он требует стиля DOM. Некоторые языки программирования имеют библиотеки, которые позволяют подавать вход SAX в XSLT-процессор, но это обязательно подразумевает ограничения на использование языка XSLT или памяти не намного лучше, чем у DOM. Однако PHP не имеет возможности делать XSLT-чтение SAX-входа.
Это оставляет нам альтернативы DOM; есть один и называется SimpleXML. SimpleXML немного сложно использовать, если ваш документ имеет пространства имен. Старинный бенчмарк, кажется, указывает, что он несколько быстрее и, вероятно, также менее расточительно с потреблением памяти, чем DOM на больших файлах.
И, наконец, я был на твоем месте один раз на другом языке программирования. Решение заключалось в том, чтобы разделить документ на небольшие, основанные на простых правилах. Каждый небольшой документ содержал заголовок, скопированный из всего документа, один элемент «detail» и нижний колонтитул, что делает его формат действительным для схемы большого XML-файла. Он обрабатывался с использованием XSLT (при условии, что обработка одного элемента детали не рассматривается в каком-либо другом детальном элементе), а выходы объединены. Это работает как шарм, но не выполняется в секундах.
Итак, вот ваши варианты. Выбери один.