PHPで大規模なXMLファイルを解析する必要があります.1つは6.5 MBであり、さらに大きくなる可能性があります。 私が読んだようなSimpleXML拡張は、ファイル全体をオブジェクトに読み込みますが、これはあまり効率的ではありません。 あなたの経験では、何が最善の方法でしょうか?PHPで大規模なXMLを処理する最良の方法
答えて
大きなファイルの場合は、DOMパーサーではなくSAX parserを使用します。
DOMパーサーでは、ファイル全体を読み込み、メモリ内のオブジェクトツリーに読み込みます。 SAXパーサーを使用すると、ファイルを順番に読み込み、データ(開始タグ、終了タグ、CDATAなど)を処理するためのユーザー定義のコールバック関数を呼び出します。
SAXパーサーを使用すると、あなたが現在使っているタグのように自分自身を少し複雑にしていますが、大きなファイルの場合にはメモリの方がはるかに効率的です。
本当にデータをどうしたいのですか?あなたは効果的にそれを使用するためにすべてのメモリを必要としますか?
6.5 MBは今日のコンピュータの点でそれほど大きくありません。あなたのデータをストリーミングすることができる場合は、例えば、ini_set('memory_limit', '128M');
しかし、あなたはSAX parserを使用して見てみたいことがあります。それは本当にあなたの使用ニーズに依存します。
ファイル自体は6.5MBですが、解析後にははるかに大きくなります。私はこの20MBのxmlを持っていました、 'xml_parse_into_struct'を呼び出すときに、memory_limitを512MBに設定する必要があります。そうしないと、失敗します。 – faulty
SAXパーサーは、Eric Petroeljeが推奨するように、大きなXMLファイルの方が適しています。 DOMパーサはXMLファイル全体にロードされ、xpathクエリを実行することができます。つまり、SAX(XML for Simple API)パーサーは一度に1行ずつ読み込み、処理のフックポイントを与えます。
例のリンクを残してくれてありがとう:) –
オブジェクト指向の例:http://php-and-symfony.matthiasnoback.nl/2012/04/php-create-an-object-oriented-xml-parser-using-the-組み込み-xml_-functions/ –
SAXパーサを移動するための方法です。私はあなたが整理されたままでいなければ、SAXの構文解析が面倒なことがあることを発見しました。
大規模なXMLファイルを解析するために、STX(XML用ストリーミング変換)に基づくアプローチを使用します。私はSAXメソッドを使用して、現在のコンテキスト(つまり、ルートノードと現在のノードの間のノードのみ)のデータを追跡するSimpleXMLオブジェクトを構築します。次に、SimpleXMLドキュメントを処理するために他の関数が使用されます。
各行(StackOverflowデータダンプ)に要素があるようになった大きなXMLファイルを解析する必要がありました。この特定のケースでは、一度に1行ずつファイルを読み取り、SimpleXMLを使用して各行を解析するだけで十分でした。私にとっては、これは新しいことを学ぶ必要がないという利点がありました。
それが私の感想:
https://github.com/prewk/XmlStreamer
ファイルをストリーミングしながら、XMLのルート要素にすべての子を抽出する単純なクラスです。 pubmed.comの108 MBのXMLファイルでテストされています。大規模なXMLファイルでDOMDocument
を使用する場合は
class SimpleXmlStreamer extends XmlStreamer {
public function processNode($xmlString, $elementName, $nodeIndex) {
$xml = simplexml_load_string($xmlString);
// Do something with your SimpleXML object
return true;
}
}
$streamer = new SimpleXmlStreamer("myLargeXmlFile.xml");
$streamer->parse();
、load()
方法の選択肢にLIBXML_PARSEHUGE
フラグを渡すことを忘れないでください。
$checkDom = new \DOMDocument('1.0', 'UTF-8');
$checkDom->load($filePath, LIBXML_PARSEHUGE);
(120moのXMLファイルで動作します)
- 1. MPI大規模データ処理
- 2. WCFで巨大なリクエストを処理する最良の方法
- 3. PHP MYSQLを使用した大規模なCSVファイルの処理
- 4. 大規模なアプリケーション - データアクセスの処理方法
- 5. Symfony2の大きなフォームコレクションを処理する最良の方法
- 6. 大規模なJavaデータ配列の処理と管理を最適化する
- 7. 大規模なプロジェクトでUIウィジェットの翻訳を処理する方法は?
- 8. 大規模なMySQLテーブルを再生成する最良の方法
- 9. 大規模操作の処理Swift
- 10. 大規模なcsvファイルをRで処理するストリーム
- 11. 大規模なASP.NET MVC2プロジェクトでファイルを整理する最善の方法は?
- 12. 大規模なデータセットをOracle SQLデータベースにインポートする最も良い方法は?
- 13. 追加大規模なXML
- 14. 大規模なXMLファイルでイベントオブジェクトを見つける方法
- 15. NodeJS、大規模なCSVファイルの処理を約束する
- 16. C++大規模プログラムの管理方法
- 17. 大規模なXML文書を再整理する
- 18. 大規模なオーバーヘッドを伴うApache Beamでのバッチ処理
- 19. SSASでProcessAddを使用して大規模処理をカスタマイズする方法は?
- 20. ExtJs Gridを大規模プロジェクトに展開するための最良の方法
- 21. Perl :: XML :: Splitで大規模なXMLファイルを分割する方法
- 22. Python 3で反復処理を大規模に拡張する方法
- 23. 大規模なユーザーのPowerShell処理が非常に遅い - より良い方法がありますか?
- 24. PHP - 大規模なPOSTリクエストサーバエラー
- 25. Javascript、大規模な非常に大きなテーブルをDOMに追加する最良の方法
- 26. 大規模なXMLファイルの更新方法
- 27. 大規模なXMLファイルの15.1
- 28. SPA用の大規模なURLクエリパラメータの処理
- 29. 複数のajaxリクエストで "大規模なデータjsonリクエスト"を処理する
- 30. トーチモデルのレイテンシの小さい大規模なデータセットを読み取る最良の方法は何ですか?
チェックアウト([PHPで解析を引い] http://www.ibm.com/(同じことが
DOMDocument
オブジェクトの他のload
方法に適用されます) developerWorks/xml/library/x-pullparsingphp/index.html) – Randolphoこの記事はXMLReaderに関するものです: http://php.net/manual/en/book.xmlreader.php "SimpleXMLとは異なり、これは完全なXMLパーサで、 DOMとは異なり、利用可能なメモリよりも大きなドキュメントを扱うことができます。SAXとは異なり、プログラムを制御します。 – WayFarer
私はXMLReaderで成功した人がいると聞いています:http://php.net/manual/en/book.xmlreader.php – Steven