Использование памяти PHP DOMDocument нелинейно возрастает при использовании больших XML-файлов.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Использование памяти PHP DOMDocument нелинейно возрастает при использовании больших XML-файлов.

Сообщение Anonymous »

Я столкнулся с серьезными проблемами масштабирования памяти при использовании DOMDocument с XPath для больших XML-файлов в PHP 8.3. Использование памяти кажется нелинейным:

Код: Выделить всё

$dom = new \DOMDocument();
$dom->load("SwissProt.xml");
Для воспроизведения (это файл размером 115 МБ):

Код: Выделить всё

wget "https://aiweb.cs.washington.edu/research/projects/xmltk/xmldata/data/SwissProt/SwissProt.xml"
Если у вас установлен GNU Time, вы можете запустить его с помощью

Код: Выделить всё

time -v php test.php

Код: Выделить всё

...
Maximum resident set size (kbytes): 1697648
...
Да, это 1,6 ГБ!
Наблюдаемое использование памяти:
  • 80 МБ XML-файл → использует ~500 МБ памяти
  • 300 МБ XML-файл → использует несколько ГБ памяти
Это нелинейное масштабирование памяти делает его непрактичным для больших файлов. Есть ли способ использовать DomDocument, не располагая весь документ в памяти? Потоковое воспроизведение файла или что-то в этом роде? Я думаю, что можно обойти этот XML-файл на несколько частей.
Есть альтернативы, но мне нужен DomDocument, поскольку мне нужно запросить элемент через XPath.

Похоже, это связано с базовой библиотекой libxml2, вот еще один пост об этом. libxml2 занимает огромную память (например, 8 ГБ для 600 МБ документа) для синтаксический анализ
Я также столкнулся с очень похожим потреблением памяти при использовании библиотеки Python lxml.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -xml-files
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»