【问题标题】:XSLTProcessor xmlSAX2Characters: out of memoryXSLTProcessor xmlSAX2Characters:内存不足
【发布时间】:2012-06-27 04:20:27
【问题描述】:

我有一个加载 500 mb xml 文件并使用 xsl 模板解析文件的页面。 解析器在我的本地环境中完美运行。我正在使用 WAMP。

在网络服务器上。

警告:DOMDocument::load() [domdocument.load]: (null)xmlSAX2Characters: /home/mydomain/public_html/xslt/largeFile.xml 内存不足,行:/home/mydomain/public_html/ 中的 2031052第 6 行的 xslt/parser_large.php

我的代码如下,第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

对此的任何建议/经验将不胜感激

【问题讨论】:

    标签: php xml xslt xml-parsing


    【解决方案1】:

    这是可悲的事实。有两种使用 XML 的基本方法,基于 DOM,其中整个 XML 文件一次存在于内存中(需要相当大的开销以使其快速遍历),以及基于文件通过内存的位置,但只有一个 SAX它的一小部分在任何给定时间都存在。

    但是,对于 DOM,大量内存消耗是很正常的。

    现在 XSLT 语言通常允许在任何时候访问整个文件的任何部分的构造,因此它需要 DOM 样式。一些编程语言的库允许将 SAX 输入提供给 XSLT 处理器,但这必然意味着对 XSLT 语言或内存消耗的限制并不比 DOM 好多少。不过,PHP does not have a way 让 XSLT 读取 SAX 输入。

    这给我们留下了 DOM 的替代方案;有一个,称为 SimpleXML。如果您的文档有命名空间,SimpleXML 是一点点trickyAn ancient benchmark 似乎表明它比大文件上的 DOM 更快一些,并且在内存消耗方面可能也更少浪费。

    最后,我曾经在另一种编程语言中处于你的位置。解决方案是根据简单的规则将文档拆分为小文档。每个小文档都包含一个从整个文档复制的页眉、一个“详细”元素和一个页脚,使其格式对大 XML 文件的模式有效。它是使用 XSLT 处理的(假设一个细节元素的处理不查看任何其他细节元素)并将输出组合在一起。这就像魅力一样,但不是在几秒钟内实现的。

    所以,这是您的选择。选择一个。

    • Parse and process XML using SAX
    • 使用SimpleXML 并希望它允许在同一内存中使用稍大的文件。
    • 执行外部 XSLT 处理器并希望它允许在同一内存中使用稍大的文件。
    • 使用 this method 拆分和合并 XML,并仅在小块上应用 XSLT。此方法仅适用于某些架构。

    【讨论】:

    • 我在 WAMP 和网络服务器上都使用 PHP 版本 5.3.10。使用 WAMP 可以正确解析相同的 xml 文件。
    • @SantoshPillai - 您的 XML 文件中最长连续文本的长度是多少?
    • 150 个字符是最长的连续行。
    • @SantoshPillai - 每行至少包含一个标签?连续文本是指基本上没有被<> 字符打断的文本;换行无关紧要。连续文本可能包含<>,在某些文本编辑器中可能显示为尖括号。
    • 是的,每一行都有一个标签。我的 xml 文件中的一些连续文本如下所示。 SubNetwork=Root,SubNetwork=node007,MeContext=node007,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=caecca
    猜你喜欢
    • 2014-10-15
    • 2011-05-21
    • 2021-12-20
    • 2021-10-29
    • 1970-01-01
    • 2020-03-12
    • 2015-08-11
    • 2019-06-07
    • 2019-04-19
    相关资源
    最近更新 更多