PHP解析非常大的xml文件2.77 GB时内存不足

时间:2018-02-11 22:56:38

标签: php xml xml-parsing

当我解析14 MB xml文件时,一切运行良好,但是当我需要解析2.77 GB服务器崩溃时内存不足。

我尝试用以下内容添加内存和执行时间:

ini_set('max_execution_time', 600);
set_time_limit("600");
ini_set("memory_limit","1024M");

无限制地无限制地工作

以下是使用SimpleXML的代码:

$xml = simplexml_load_file("detailed_data.xml");
if (!$xml) return "error loading xml";
print('<pre>');
foreach ($xml->art as $v1) {
    $intid = $v1->attributes()->int_id[0];
    $booktitle = $v1->text_description->hidden->{'title-info'}->{'book-title'};
    //echo "booktitle:$booktitle = ";
    $added = $v1->attributes()->added[0];
    $lastrelease = $v1->attributes()->last_release[0];

还尝试使用XMLReader:

$reader = new XMLReader();  
$reader->open('detailed_data.xml');
print('<pre>');
while ($reader->read()) {

    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'art') {  

    $v1 = new SimpleXMLElement($reader->readOuterXML());  

    $intid = $v1->attributes()->int_id[0];

    $booktitle = $v1->text_description->hidden->{'title-info'}->{'book-title'};
    //echo "booktitle:$booktitle = ";

    $added = $v1->attributes()->added[0];

输出命令head detailed_data.xml

<?xml version="1.0" encoding="UTF-8"?><litres-updates>

<art int_id="118915" added="2007-04-03 16:18:00" price="59.90" cover="jpg" last_release="2011-10-13 12:56:26" on_sale="1" file_id="3804925" chars="791605" type="0" file="3804925" show_preview="4" allow_read="1" lvl="3"><text_description><hidden><title-info><genre>sf_social</genre><genre>sf_history</genre><author><first-name>Марина и Сергей</first-name><last-name>Дяченко</last-name><id>e00dfc87-2a80-102a-9ae1-2dfe723fe7c7</id></author><book-title>Армагед-дом</book-title> <annotation><p>Мир на пороховой бочке, и несколько раз за век эта бочка взрывается Апокалипсисом. Из моря выходят чудовища, звезда Полынь опрокидывается в реки, превращая воду в кровь, ангел трубит в трубу над пепелищами. Лишь загадочные Врата сумеют спасти живых, чтобы люди могли после катастрофы отсроить жизнь заново – если, конечно, успеют войти в эти Врата. Мир привык, потому что привыкают ко всему. Лгут депутаты, мудрствуют спецслужбы, защищаются диссертации, рождаются дети. И конечно же, выдаются спецпропуска во Врата. Все как всегда, все как везде; регулярный, обыденный, ужасный Армагеддон, ставший для его обитателей Армагед-домом.</p>
<p>Жизнь главной героини – тому порука.</p>
<p>И тем не менее…</p>
</annotation><date value="1999-01-01">1999</date> <coverpage><image href="#cover.jpg"/></coverpage><lang>ru</lang> </title-info> <document-info><author><first-name>Roland</first-name> <last-name/> </author> <program-used>FB Editor v2.0</program-used> <date value="2008-11-28">28 November 2008</date> <src-url>http://www.litres.ru/pages/biblio_book/?art=118915</src-url><src-ocr>Текст предоставлен правообладателем</src-ocr> <id>30783516-71df-4d51-84c5-ceb7e938fa87</id></document-info> <publish-info><book-name>Армагед-дом</book-name> <publisher>Эксмо</publisher> <city>Москва</city> <year>2005</year> <isbn>5-699-14200-2</isbn> <sequence name="Триумвират"/></publish-info></hidden></text_description><year_rating quantity="168776"/><arts_relations><art_relation rel_art="4578560" relation="4"/><art_relation rel_art="4578560" relation="3"/></arts_relations><authors><author id="e00dfc87-2a80-102a-9ae1-2dfe723fe7c7"><subject_id>44608</subject_id><url>marina-i-sergey-dyachenko/</url><first-name>Марина и Сергей</first-name><middle-name></middle-name><last-name>Дяченко</last-name><full-name-rodit>Марины и Сергея Дяченко</full-name-rodit><lvl>4</lvl><relation>0</relation></author><author id="8488af72-967f-102a-94d5-07de47c81719"><subject_id>58188</subject_id><url></url><first-name>Литагент</first-name><middle-name></middle-name><last-name>Г.Л. Олди</last-name><full-name-rodit></full-name-rodit><lvl>1</lvl><relation>2</relation></author></authors></art>

<art int_id="118916" added="2007-04-03 16:18:04" price="59.90" cover="jpg" last_release="2011-10-14 19:38:55" on_sale="1" file_id="3809145" chars="691436" type="0" file="3809145" show_preview="4" allow_read="1" lvl="3"><text_description><hidden><title-info><genre>magician_book</genre><author><first-name>Марина и Сергей</first-name><last-name>Дяченко</last-name><id>e00dfc87-2a80-102a-9ae1-2dfe723fe7c7</id></author><book-title>Скрут</book-title> <annotation><p>В довольно-таки мрачном фэнтезийном мире зарождается довольно-таки светлая и романтическая любовь… И, возможно, они жили бы долго и счастливо и умерли в один день – если бы в ветвях зловещего леса не жил, ожидая своего часа, могущественный и безжалостный, с довольно-таки странными представлениями о справедливости – Скрут…</p>
</annotation><date value="1997-01-01">1997</date> <coverpage><image href="#cover.jpg"/></coverpage><lang>ru</lang> </title-info> <document-info><author><first-name>Consul</first-name> <last-name/> <email>fictionbook@gmail.com</email> </author> <program-used>FB Tools, FB Writer v1.1</program-used> <date value="2003-10-25">2003-10-25</date> <src-url>http://www.litres.ru/pages/biblio_book/?art=118916</src-url><src-url>http://www.aldebaran.ru/</src-url> <id>0fe2dba8-1890-44f1-96e6-544611df0f0a</id> <version>1.0</version> </document-info> <publish-info><year>2003</year> <sequence number="00" name="Нить времен"/></publish-info></hidden></text_description><year_rating quantity="71722"/><arts_relations></arts_relations><authors><author id="e00dfc87-2a80-102a-9ae1-2dfe723fe7c7"><subject_id>44608</subject_id><url>marina-i-sergey-dyachenko/</url><first-name>Марина и Сергей</first-name><middle-name></middle-name><last-name>Дяченко</last-name><full-name-rodit>Марины и Сергея Дяченко</full-name-rodit><lvl>4</lvl><relation>0</relation></author></authors></art>

也许我可以将2.77 GB的大文件拆分成较小的部分?

1 个答案:

答案 0 :(得分:0)

这条线帮了我:

$reader->open('compress.zlib://detailed_data.xml.gz');

打开压缩文件detailed_data.xml.gz,大小为544.2 MB,而未压缩文件detailed_data.xml的大小为2.77 GB,解决了这个问题。