【问题标题】:Read/Write large XMLs without using too much memory in PHP在 PHP 中不使用太多内存的情况下读取/写入大型 XML
【发布时间】:2018-01-06 22:35:54
【问题描述】:

我正在尝试查询一些非常大的 XML 文件(最多几个 gig),检查它们的格式是否正确,然后将它们写入硬盘。看起来很简单,但由于它们太大了,我无法在内存中保存整个文档。因此我的问题是: 当可用 RAM 小于一个文档的大小时,如何读取、检查和写入大型 XML 文件?

我的方法: 使用 XMLReader 逐个节点读取它(如果成功,则文档必须格式正确)并使用 XMLWriter 进行写入。问题:XMLWriter 似乎将所有内容都存储在 RAM 中,直到文档完成。 DOM 文档和 SimpleXML 似乎也是如此。还有什么我可以尝试的吗?

【问题讨论】:

  • 为什么不使用XSD 来验证 XML?
  • @halloei 能够验证文档绝对有用(而不仅仅是检查格式是否正确),但不幸的是,由于其结构经常变化,这是不可能的。
  • 如果您使用XMLWriter::openURI(),则不会发生这种情况。它有一个内部缓冲区,因此它不会写入每个方法调用,但您可以使用XMLWriter::flush() 触发它

标签: php xml xmlreader xmlwriter


【解决方案1】:

您的方法似乎很合适,要解决 XMLWriter 的 RAM 问题,您可以尝试定期将内存刷新到输出文件中。

<?php
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0', 'UTF-8');
for ($i=0; $i<=10000000; ++$i) {
    $xmlWriter->startElement('message');
    $xmlWriter->writeElement('content', 'Example content');
    $xmlWriter->endElement();
    // Flush XML in memory to file every 1000 iterations
    if (0 == $i%1000) {
        file_put_contents('example.xml', $xmlWriter->flush(true), FILE_APPEND);
    }
}
// Final flush to make sure we haven't missed anything
file_put_contents('example.xml', $xmlWriter->flush(true), FILE_APPEND);`

来源:http://codeinthehole.com/tips/creating-large-xml-files-with-php/

【讨论】:

  • 非常感谢,我要试试,听起来确实不错
猜你喜欢
  • 2015-04-25
  • 2011-09-05
  • 2017-09-19
  • 1970-01-01
  • 2017-12-26
  • 2019-08-22
  • 2015-07-23
  • 2020-01-18
  • 2023-03-23
相关资源
最近更新 更多