2011-07-21 10 views
3

私は巨大なXMLファイルを持つ私が構築するアプリケーションのXMLReaderを避けようとしています。 SimpleXMLは書き込みが簡単で、非常に忙しいサーバーでは(メモリとパフォーマンスの問題)をうまく処理する方法があるのだろうかと思いました。 私がやることは、主に検索フォームからそのXMLのデータをエコーすることです。SimpleXMLを使用して巨大なXMLファイルを処理できますが、メモリとパフォーマンスの問題を防ぐにはどうすればよいですか?

+5

要するに、 'simpleXML'(DOMのような他の文書ベースのパーサと同様)は、読み込み中に常に_entire_ XMLファイルを読み込むため、意味がありません。 XMLReader(ストリームベース)を見てください。 – KingCrunch

+2

なぜXMLReaderを避けようとしていますか?そして、なぜこのXMLを解析していますか?ちょうどいくつかのノードのために? SimpleXMLとXMLReaderは異なる目標とパフォーマンスを持っていますが、同じことを達成できます。 – Planplan

+0

私はいくつかの言葉を誤解しているかもしれません。私は私を助ける多くの事例を見つけることができないので、私はそれを避けようとしています。あなたのコメントを読んで、私はXMLReaderと一緒に行く必要があると思います。 – EnexoOnoma

答えて

1

XMLReaderを使用せずに実際にやりたければ、ここで行うことができます。

fopenを使用して、そのファイルのN個のバイトを開いて読み込みます。

難しい部分ですが、完全に実行可能です 何かテキストの真ん中にいる場合は、閉じていないものを閉じて、必要に応じて後戻りすることによって行います。

XMLチャンクが最終的に有効な場合、simplexmLで解析できます。

別のXMLファイル にチャンクまたは保存して、別のチャンクを作成します。

XMLが複雑な場合は、明らかに少し痛いかもしれません。

要約: 独自のカスタム/汚れのないxmlパーサー/フィクサーを作成することで、巨大なXMLファイルを複数の小さなファイルに分割できます。

+0

こんにちは、これは私がXML Parserで試したものです(ここでは、最後のhttp://www.ustrem.org/en/articles/large-xml-files-in-php-en/をご覧ください)。私がテストしたのはXML ParserとSimpleXMLの120MBのファイルで、同じものを出力しています。私はメモリテストを行い、SimpleXMLのメモリが低く、信じられないほど高速であることがわかりました。私が読んだとおり、私は別の結果を期待していたが、これは私が見るものである。 – EnexoOnoma

1

あなたのファイルが大部分が似ているノードの場合、本の数が多いにもかかわらず書籍のレコード自体が小さい書籍のような大きなリストの場合、XMLReaderを使ってsmauraの答えのバリエーションを使用できます各ノードをXMLストリングに変換し、それをSimpleXMLに渡します。そうすれば、大きなリストにストリーミングソリューションを使用していますが、各レコードを取得すると、SimpleXMLでレコードに簡単にアクセスできる利点があります。

関連する問題