php - 减少在 php 中解析大型 xml 文件的处理时间

标签 php xml performance parsing profiling

我在大型 xml 文件的处理时间方面遇到了这个问题。总的来说,我的意思是平均 600MB。 目前,解析数据并将其插入数据库大约需要 50 - 60 分钟。 我想就如何改善处理时间征求意见?就像减少到 20 分钟。

因为根据当前时间,我需要 2.5 个月的时间才能将 xml 中的内容填充到数据库中。顺便说一下,我有 3000 多个 xml 文件,平均大小为 600mb。我的 php 脚本在命令行中通过 cron 作业。

我也阅读了其他类似下面的问题,但我还没有找到任何想法。 What is the fastest XML parser in PHP?

我看到有些人已经解析了最大 2GB 的文件。我想知道处理时间有多长。

希望大家多多帮忙。 将不胜感激。 谢谢。

我有这个代码:

$handler = $this;
$parser = xml_parser_create('UTF-8');
xml_set_object($parser, $handler);
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "cdata");

$fp = fopen($xmlfile, 'r');

while (!feof($fp)) {
    while (($data = fread($fp, 71680))){

    }
}

我首先将解析数据放在一个临时数组中。 我的 mysql 插入命令在 endElement 函数内。 有一个特定的结束标记来触发我对数据库的插入命令。

感谢您的回复....

最佳答案

在没有看到任何代码的情况下,我首先要建议的是不要使用 DOM 或 SimpleXMLElement,因为它们会将整个内容加载到内存中。

你需要使用像XMLReader这样的流解析器.


编辑:

因为您已经在使用流解析器,您不会从更改解析器中获得巨大 yield (老实说,我不知道 XML Parser 和 XMLReader 之间的速度差异,因为后者使用 libxml,它可能更好,但可能不值得)。

接下来要看的是您是否在代码中做任何愚蠢的事情;为此,我们需要更全面地了解您是如何实现的。

你说你将数据放在一个临时数组中,并在到达结束标记时调用 MySQL insert。你在使用准备好的陈述吗?您是否使用事务来批量执行多个插入操作?

不过,解决瓶颈的正确方法是对代码运行分析器。我最喜欢的工作工具是 xhProf with XHGui .这将告诉您正在运行哪些函数、运行了多少次、运行了多长时间以及它们消耗了多少内存(并且可以在一个漂亮的调用图中显示所有这些,非常有用)。

使用 GitHub 的自述文件中的说明。这是一个 tutorial和另一个 useful tutorial (请记住,最后一个是针对没有我链接到的 XHGui 扩展的探查器的)。

关于php - 减少在 php 中解析大型 xml 文件的处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11983841/

相关文章:

php - 在(纯)PHP/MySQL 中查找类似图像

php - 存储客户产品的最佳方法

java - 迭代 XML 中声明的每个小部件并在 java 和 android 开发中执行操作

Nodejs 中 url.parse 的性能

c++ - 确定景观中所有点与具有特定属性的点的距离的最快方法

c++ - 为什么 64 位版本的应用程序比 32 位版本的应用程序慢得多

php - 使用 php mysql 更新帖子

php - 在我的服务器中打开 zlib.output_compression 有什么注意事项吗?

xml - 数据格式看起来像 JSON,但实际上并非如此。可以帮忙鉴定一下吗?

java - 来电号码先减零