【问题标题】:Parsing extremely large XML files in php在 php 中解析非常大的 XML 文件
【发布时间】:2013-02-28 02:58:23
【问题描述】:

我需要解析 40GB 大小的 XML 文件,然后进行规范化,然后插入到 MySQL 数据库中。我不清楚需要在数据库中存储多少文件,也不知道 XML 结构。

我应该使用哪个解析器,你会怎么做?

【问题讨论】:

  • 对于大文件,总是使用像 XMLReader 这样的拉解析器;只需尝试将 40GB 的文件加载到 SimpleXML 的内存中。
  • 40 Gb?哇,我在 mac os x 机器上处理 700 Mb xml 文件时遇到了麻烦。
  • 我建议您编写自己的 XML 解析器,具有最少的功能(只有您想要的功能)。这样您就拥有了最轻量级的 XML 解析器,当然还会定期进行优化
  • @Girish - 这是一个疯狂的建议。地球上一些最优秀的程序员已经编写了高度优化的 XML 解析器,普通的 SO 发帖人能够做得更好的机会非常小。

标签: php mysql xml xml-parsing large-files


【解决方案1】:

在 PHP 中,您可以使用 XMLReaderDocs 读取超大型 XML 文件:

$reader = new XMLReader();
$reader->open($xmlfile);

超大型 XML 文件应以压缩格式存储在磁盘上。至少这是有道理的,因为 XML 文件具有很高的压缩率。例如像large.xml.gz这样的gzip。

PHP 通过compression wrappersDocs 很好地支持XMLReader

$xmlfile = 'compress.zlib://path/to/large.xml.gz';

$reader = new XMLReader();
$reader->open($xmlfile);

XMLReader 允许您“仅”对当前元素进行操作。这意味着它是仅向前的。如果您需要保持解析器状态,您需要自己构建它。

我经常发现将基本动作包装到一组迭代器中很有帮助,这些迭代器知道如何对XMLReader 进行操作,例如仅迭代元素或子元素。您可以在Parse XML with PHP and XMLReader 中找到这一点。

参见:

【讨论】:

    【解决方案2】:

    很高兴知道您实际上打算用 XML 做什么。您解析它的方式很大程度上取决于您需要执行的处理以及大小。

    如果这是一次性的任务,那么我过去是通过在做任何其他事情之前发现 XML 结构来开始的。我的 DTDGenerator(参见 saxon.sf.net)很久以前就是为此目的而编写的,并且仍然可以完成这项工作,现在还有其他工具可用,但我不知道它们是否进行流式处理,这是这里的先决条件。

    您可以编写一个使用拉式或推式流解析器(SAX 或 StAX)处理数据的应用程序。这有多容易取决于您必须进行多少处理以及您必须维护多少状态,而您没有告诉我们。或者,您可以尝试在 Saxon-EE 中提供的流式 XSLT 处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2013-03-24
      • 2011-08-06
      • 2010-10-29
      相关资源
      最近更新 更多