我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。 解析器在我的本地环境中完美运行。我正在使用 WAMP。
在网络服务器上。
警告:DOMDocument::load() [domdocument.load]: (null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xml 中内存不足,行:2031052 in/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 does not have a way但是,让 XSLT 读取 SAX 输入。
这给我们留下了 DOM 的替代品;有一个,叫做 SimpleXML。 SimpleXML 是有点tricky如果您的文档具有 namespace ,则使用。 An ancient benchmark似乎表明它比大文件上的 DOM 更快一些,并且可能在内存消耗方面也更少浪费。
最后,我曾经在另一种编程语言中遇到过你。解决方案是根据简单的规则将文档拆分成小文档。每个小文档都包含一个从整个文档复制而来的标题、一个“详细信息”元素和一个页脚,使其格式对大 XML 文件的架构有效。它是使用 XSLT 处理的(假设一个细节元素的处理不考虑任何其他细节元素)并将输出组合在一起。这就像 charm 一样工作,但它不是在几秒钟内实现的。
所以,这是您的选择。选择一个。
关于php - XSLTProcessor xmlSAX2Characters : out of memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197337/