繁体   English   中英

使用php加速xml解析

[英]speed up xml parse with php

嗨,我有一个xml文件,其中包含大约12,000条记录。 我编写了代码并且工作正常,只需要一段时间来解析xml文件并返回内容。 有没有办法加速这个过程?

我的代码:

<?php 
$dom = new DOMDocument(); 
$dom->load('comics.xml'); 
foreach ($dom->getElementsByTagName('record') as $entry) 
{   
$title = $entry->getElementsByTagName('title')->item(0)->textContent;   
echo $title;   

} 
?>

XML文件(只有一个演示在那里不能链接所有大声笑):

<?xml version='1.0' encoding='utf-8'?>
<calibredb>
  <record>
    <id>1</id>
    <uuid>991639a0-7cf6-4a34-a863-4aab8ac2921d</uuid>
    <publisher>Marvel Comics</publisher>
    <size>6109716</size>
    <title sort="Iron Man v1 101">Iron Man v1 101</title>
    <authors sort="Unknown">
      <author>Unknown</author>
    </authors>
    <timestamp>2012-04-15T18:49:22-07:00</timestamp>
    <pubdate>2012-04-15T18:49:22-07:00</pubdate>
    <cover>M:/Comics/Unknown/Iron Man v1 101 (1)/cover.jpg</cover>
    <formats>
      <format>M:/Comics/Unknown/Iron Man v1 101 (1)/Iron Man v1 101 - Unknown.zip</format>
    </formats>
  </record>
  </calibredb>

DOM方法适用于小型数据集,因为所有XML结构都被解析并放入内存中。

在您的情况下,您应该在解析大型XML文件时使用SAX方法,因为XML文件是逐行读取的,而不是一次读取所有内容。

谷歌有一些例子: https//www.google.lv/search?q = php + SAX + XML

答案很大程度上取决于数据。 一些可能的解决方案是将数据移动到像MySQL这样的关系数据库中,或者将数据规范化为CSV格式,这种格式更容易解析,占用更少的空间,并且可以逐行读取。

我并不是特别熟悉PHP实现,但是在使用Xerces的C ++中使用以下方法我已经看到了针对您的场景的巨大性能改进。

我没有按名称请求所有元素并等待返回整个NodeList,而是发现在根节点下获取第一个子节点然后获取NextSibling节点要快得多。 使用每个兄弟作为新节点,您将继续获取NextSibling,直到没有剩余。

希望这提供了PHP的性能改进,类似于它在C ++中的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM