2011-12-14 17 views
0

私は300MBのXMLファイルを読み込むためにXSLTを使用しています - タグの内容をチェックする必要があり、それに基づいて他のタグ要素を出力として出力する必要があります。xmlをより速く読む方法はありますか?

これは非常に長い時間(10分)を要し、最終的には「キル」と他の出力は終了しません。

他に高速な方法はありますか? JavaのSAXパーサを使って読むことはできますか?前もって感謝します。

+0

説明が必要です:xmlファイルを「読み込む」とはどういう意味ですか?あなたはそれで達成しようとしている目標は何ですか? – Daryn

+0

ここでは、いくつかのタグの内容をチェックし、それに基づいて出力として他のタグ要素を出力する必要があることを意味します。 – anand

+0

タグを見つけるためにファイル全体を読み込む必要があるため、あなたが何かを変更する必要がある場合は、ファイル全体を書き直す必要があります。 300MBを処理するのにどれくらい時間がかかりますか? –

答えて

3

最初のステップは、XMLパーザまたはXSLTプロセッサで時間が過ごしたかどうかを判断することです。何もしない変換(<xsl:template match="/"/>)、および(b)すべてをコピーする変換(<xsl:template match="/"><xsl:copy-of select="."/></xsl:template>)結果を実際の変換と比較してください。

XSLTプロセッサは多種多様であり、可能な場合は、いくつか試してみる必要があります。また、XSLTプロセッサを使用するさまざまな方法を試す必要があるかもしれません。たとえば、DOMを使用するよりもはるかに効率的な内部ツリーモデルを持つものがあります。だからあなたのプロセッサーの詳細とその使用方法をここに戻ってください。

最後に、「長い時間」は私には何も教えてくれません。実際にどれくらいの時間がかかるか教えてください。それが妥当かどうか、どこかで何かが間違っているかどうかを教えてください。

+0

優れたXSLTプロセッサは、ステートマシン内のバックリファレンスが不要なため、すべてのものをコピーするので、何もしないものとはまったく対照的ではありません。 –

+0

それは10分以上かかり、最後に「殺された」と言って終わります。他の出力はありません:( – anand

+0

@anand:将来的には、この種の情報で質問を更新してください。 – shellter

1

XSLTスタイルシートは、正規表現と同じようにステートマシンに変換することができます(XSLTを扱うライブラリの中には、コンパイルオプションがあるため、それをしている)。

これが完了すると、非常に高速になる可能性があります。スタイルシートの性質はこれに影響します。テンプレートマッチングがすべて順方向にしか行えない(あるいは内部的に書き直すことができる)ようなものであれば、何かがドキュメントに多くのステップを戻す必要がある場合よりもはるかに速くなります。

最高の実装でさえXMLの前方のみの解析(SAXのようなプッシュであろうとプルであろうと)の最善の実装よりもおそらく遅くなるでしょう。しかし、XSLTのアプローチと同じように、forward-onlyパーサが以前に遭遇した要素に関する多くの状態を保持し、以前の要素を参照する方法でいくつかの要素に応答できるようにする必要がある場合、かなり。最終的にはDOMのアプローチ(ドキュメント全体かサブツリーかに関わらず)がスピードと比較しやすくなります(これまでに遭遇した要素を参照することはDOMが最も簡単になるため正確です)。

どちらのアプローチをとっても、ドキュメント内の「上」または「下」を参照する部分を書き換えて、これよりも少ないことを確認すると、より大きな利益を得ることができます。

関連する問題