4

こんにちは私は約12,000レコードのxmlファイルを持っています。コードを記述しましたが、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ファイル(そこにあるデモは1つだけで、すべてをリンクすることはできません):

<?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>
4

3 に答える 3

2

DOMアプローチは、すべてのXML構造が解析されてメモリに配置されるため、小さなデータセットに適しています。

状況によっては、大きなXMLファイルを解析するときにSAXアプローチを使用する必要があります。これは、XMLファイルが一度にすべてではなく、行ごとに読み取られるためです。

Googleにはいくつかの例があります:https ://www.google.lv/search?q = php + SAX + XML

于 2012-07-30T23:15:42.233 に答える
1

答えはデータに大きく依存します。考えられる解決策のいくつかは、データをMySQLのようなリレーショナルデータベースに移動するか、データをCSVのような形式に正規化することです。これは、解析が簡単で、場所を取らず、行ごとに読み取ることができます。

于 2012-07-30T23:02:09.890 に答える
0

私はPHPの実装に特に精通していませんが、Xercesを使用したC ++で次のアプローチを使用すると、シナリオのパフォーマンスが大幅に向上します。

名前ですべての要素を要求し、NodeList全体が返されるのを待つ代わりに、ルートノードの下にある最初の子ノードを取得してからNextSiblingノードを取得する方がはるかに高速であることがわかりました。各兄弟を新しいノードとして使用して、残りがなくなるまでNextSiblingを取得し続けます。

うまくいけば、これにより、C++の場合と同様にPHPのパフォーマンスが向上します。

于 2012-07-30T23:13:34.450 に答える