【问题标题】:Parsing big XML file解析大 XML 文件
【发布时间】:2014-09-11 08:13:44
【问题描述】:

我检查了很多问题,但没有得到答案。

我有一个需要解析的大 XML 文件。目前我正在用 XMLReader 解析它。在我开始将它插入 SQL db 之前它工作得很好。如果我只回显解析 xml,它可以正常工作,如果我插入它,我会收到 504 Gateway Time-out 错误。这是我的代码示例:

我在哪里解析 xml:

$xml = new XMLReader();
$xml->open(APP_PATH_OWA."/trnUpload/TRNavteraData.xml");

while($xml->read()){
 //get products
 if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'table'){    
    $product = array();
 }

 if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'ident'){
    $xml->read();
    $product['id'] = $xml->value;
 }
    ...

Foreach:

foreach($products as $product){
  ...
 $productTitle = $product['title'];
 $productID = $product['id'];
 $productImageUrl = "http://www.example.com/logo.png";
 $productAttrHtml = $product['computed'];

 // after that I'm inserting those data using ZEND framework.

XML 文件大约有 300k+ 行。

整个php函数:http://pastebin.com/S8A5Rdjw

【问题讨论】:

  • 由于问题是在您开始将内容插入数据库时​​出现的,因此分享这部分代码可能会很有趣。没有DB进程需要多长时间?
  • 我马上分享,没有数据库进程用不了多久。我又想到了一件事,在我得到 504 网关超时后,我无法访问我网站的任何部分,我认为整个服务器超时。几分钟后(15-20)服务器开始正常运行,来自 XML 的文章存储在数据库中。 pastebin.com/S8A5Rdjw - 这是我的功能。
  • 您使用的是 Apache 还是 NGINX?您是否尝试过增加 php 超时限制?如果没有,请尝试将 set_time_limit(0); 放在脚本顶部。
  • 我已经更改了超时限制,我正在使用 NGINX。

标签: php xml


【解决方案1】:

序列化进程会减少内存消耗,但会增加运行时间。但我认为时间不是问题。

您可能只是使用许多插入语句来阻止对数据库(表)的访问。

一些提示:

  1. 如果框架不支持这种操作,则使用框架进行数据库导入可能会非常慢。尽量避免为此进行数据库抽象。

  2. 确保使用批量插入。大多数数据库允许以一种或另一种方式一次插入多条记录。这减少了数据库调用。 (当然会增加所需的内存,因此您必须找到平衡点。)

  3. 检查插入不会阻塞选择。取决于数据库和表处理程序上的 MySQL。

  4. 插入一个单独的表,然后重命名这些表。

  5. 生成文件并使用数据库命令行客户端将其导入。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2020-08-19
    • 2017-05-04
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2015-09-15
    相关资源
    最近更新 更多