PHP5 + XML (большого размера)

PetrV

Новичок
PHP5 + XML (большого размера)

Здравствуйте!

Есть XML большого размера ( 35 Мб )
Надо XML обработать и вывести в преобразованном виде содержание....

При загрузке
$xml = simplexml_load_file($xmlFileName);
Сервер выдает "не достаточно памяти".

Посоветуйте, как быть в этой ситуации?

Спасибо
 

A1x

Новичок
Автор оригинала: Major
юзай SAX.
разве simplexml не использует SAX ?

я тут разбирал simplexml файл 24М, после чтения этой темы попробовал для теста 48М
simplexml_load_file($xmlfile); потребляет памяти около 55К...
(скрипт запускаю в командной строке)

Что я делаю не так?
 

slach

Новичок
A1x - большинство DOM парсеров использует SAX модель для построения дерева =)

SimpleXML легко конвертируется в DOM и обратно
соответсвенно это именно ДЕРЕВО ОБЪЕКТОВ а не поточный парсер с событиями

>Что я делаю не так?
видимо ты 55k и 55M перепутал =)
 

A1x

Новичок
slach

я специально поставил memory_limit = 8M ;-)

я думаю что как раз SimpleXML не строит дерево в памяти
simplexml_load_file просто создает объект SimpleXMLElement и указывает ему файл как источник данных.
Далее при любом обращении к методам/своствам SimpleXMLElement он открывает файл, проходится по нему SAX-ом и извлекает запрошенные данные. Такой способ характеризуется малым потреблением памяти но большим временем доступа. Что я и имею на практике. Странно что у кого-то не работает.
 

tony2001

TeaM PHPClub
Совершенно нетрудно найти в исходниках, что simplexml_load_file() - это просто враппер к xmlReadFile() из libxml2, которая как раз строит всё дерево в памяти.
 

slach

Новичок
A1x var_dump сделай для переменной которой присваивается результат simplexml_load_file

хватит уже фигню говорить ;) SimpleXML документ в память грузит ВЕСЬ

если конкретно хочешь о чем то спорить, приведи код и XML файл в ZIP архиве

кстати в комментариях для SimpleXML в мануале приводится интересная ссылка на PullXML

http://nicolas.lehuen.com/index.php/post/2007/04/27/PullXML-:-an-XML-Pull-Parser-for-PHP-5
 

Major

Новичок
естественно если делать var_dump он начинает все читать в память
:confused: Че делать если чо начинаешь делать?

Млин, давно бы решил проблему, распарсивая используя поточный парсер с событиями. Ты упорно ничего не хочешь друго юзать, ибо что-то другое для тебя сложно и ты не асилишь написать многа букоф? Кури маны, пей кофе...
 

A1x

Новичок
Major
ты не понял, у меня нет проблемы и все работает так как мне надо ;-)

Проблема была у автора топика, мне было бы интересно разобраться почему у меня такая проблема не возникает при работе с файлом большего размера.
 

slach

Новичок
A1x
=)) ну вообще тут скорее всего какой то косяк или неправильно задокументированное поведение memory_get_usage

потому что несмотря на то, что показывается маленькое значение memory_get_usage...
в списке процессов реально на 50 мегабайт XML отжирается 390 мегабайт ... сам посмотри
 

Major

Новичок
Во 1х вы определитесь, где вы парсер запускаете. Из консоли - это 1 поведение, в браузере - это другое... Ничего недокументированного не бывает. Бывает неосведомленность ;)
 

A1x

Новичок
slach
да процесс занимает около 400М как из консоли так и через веб ... предположим врет memory_get_usage, но я ставлю в php.ini memory_limit = 8M и скрипт не вылетает... я в шоке )))
Может эта xmlReadFile() из libxml2 както не так выделяет память? Причем если сделать тот же var_dump или как-то иначе извлекать данные из simplexml объекта memory_get_usage показывает увеличение занимаемой памяти вплоть до вылета..

Major
взял бы сам и попробовал да? умник... ))
 

Gas

может по одной?
ставлю в php.ini memory_limit = 8M и скрипт не вылетает
наверное потому, что php понятия не имеет сколько памяти под себя гребут сторонние extensions, он отвечает только за себя. Но я не уверен и возможно Тони меня поправит.
 

A1x

Новичок
Автор оригинала: Gas
php понятия не имеет сколько памяти под себя гребут сторонние extensions, он отвечает только за себя.
тогда немного теряется смысл memory_limit, который как я понимаю в том чтобы ограничить потребление ресурсов пользователями
 
Сверху