web-dev-qa-db-ja.com

大きなXMLファイルを効率的に読み取る方法

大きなXMLファイル(約75,000行)があり、そこからカタログ(家)を作成する必要があります。リストの作成は問題なく動作しますが、今は問題があります。

カタログには、1つの家の詳細なプレゼンテーションページが必要です。ワンハウス(<item id="123">)には、家のタイプに基づいて、約800〜1200行のデータがあります。

これらのデータを読み取って表示するために、スクリプトの高速化とコード行の保存を参照するのに最適な方法はどれですか?

たとえば、一部の家にはサウナがあり、これらのデータがXMLファイルにある場合、プレゼンテーションページにはセクションサウナが含まれている必要があります。

SimpleXML を使用して、再帰関数を使用してXMLコンテンツ全体を配列に読み込み、多数のforeaches(子の最大の深さは3)を読み取る前に試しましたが、本当に醜い速度でした、そして私のコンピューターはそれほど多くの入力を処理できなかったため、再帰はまったく機能しませんでした。

ifですべての変数をクエリする以外に、このデータを構築する他の方法はありますか?

4
Owl

XMLは、大量のデータを保存する非効率的な方法です。大量のディスク領域を使用し(XMLファイルを見て、その大部分が構文と構造体の定義によって占められていることに注意してください)、アクセスが遅く、メモリを大量に消費します。ツリー全体(または少なくともツリーの大部分)は、単一の要素を取得するためだけに解析する必要があり、XMLパーサーは、多くの場合、これを行うためにメモリ空間でファイルのサイズの数倍を使用します。

パフォーマンスに敏感な何か(Webページへの情報の読み込みなど)を実行する必要がある場合、75,000行のXMLは高速ではありません。

パフォーマンスが重要な場合は、torstenmüllerの提案に従って、情報を実際にリレーショナルデータベースに移動する必要があります。その後、あなたの仕事はささいなことになります。 XMLでデータを受け取る以外に選択肢がない場合でも、プログラムが更新されるたびに、そのXMLファイルをデータベースに1回だけロードし、その後はデータベースを使用します。高速であることに加えて、データベースの操作もはるかに簡単になります。

XMLをそのまま使用することを選択した場合は、アルゴリズムについていくらか助けが得られますが、さらに情報が必要です。 Code Review に記述したコードの部分を投稿することをお勧めします。

9
user82096

たぶん、SimpleXMLが1つのステップでドキュメント全体を読み取ろうとする制限に直面していて、ドキュメントが大きいか複雑である可能性があります。代わりに、一度にビットを読み取るストリームベースまたはイベントベースのパーサーを使用し、読み取った内容に基づいてパーサーの状態を設定し、特定のイベントに反応するハンドラーを登録できます。これは簡単な例でのアイデアの説明です: http://sax.sourceforge.net/event.html

私はPHPにあまり詳しくありませんが、SAXのようなものがあるようです http://php.net/manual/en/book.xml.php 。はじめから:

この拡張機能を使用すると、XMLパーサーを作成してから、さまざまなXMLイベントのハンドラーを定義できます。

Googleで phpのSAX を検索しても、有望な見込み顧客がいくつか表示されます。

7
AnAnswer

Webページを介して情報を提示している場合は、XMLデータを分割して次のようにすることができます。

a。メインファイルには、すべてのHouses/Products/Servicesの紹介データとメタデータのみが含まれています。

b。各家/製品/サービスの詳細は、それぞれ別のファイルにあります。

アイデアは次のとおりです。

a。あなたのリストページはメインファイルを使用するだけです。

b。家/製品/サービスの詳細ページは次のようになります。

_ 1.メインXMLをロードします。

_ 2.メインXMLの必要なノードに、ハウス/製品/サービス固有のXMLをロードして追加します。 (これが唯一のものなので、ルートノードに追加するだけで済みます。)

1
Patanjali

最近私はそれを達成する方法について投稿しました、ここで投稿の概要:

過去4年間、私は多くのXMLプロバイダー(相互接続するB2Bアプリケーション)を使用してきましたが、これらのプロバイダーの中には大きなXMLファイルを配布するものもあれば、2 GBを超えるものもあります。 PHPはメモリオーバーフローの致命的なエラーを生成し、アプリケーションはそれ自体では回復できません。そのため、この投稿では、この問題を解決する方法を説明します。

  • ジェネレーター:ジェネレーターは、イテレーターインターフェースを実装せずに簡単なイテレーターを簡単に構築する方法を提供します。詳細については、次を参照してください。PHP 5.5

  • XMLReader:は、前方カーソルとして機能するため、XMLファイルを効率的に読み取ることができるlibxmlの肩のPHP実装です。

  • SimpleXMLElement:XML文字列からXMLオブジェクトを作成します。

PHPでXMLファイルを効率的に読み取る

1
Sr. Libre