17

複雑な xpath クエリの実行を含め、C# でかなり大きな XML ファイル (ここでは、1 ギガバイトを超える可能性がある) に対して何らかの処理を行う必要があります。私が抱えている問題は、System.XML ライブラリを介して通常これを行う標準的な方法では、何かを実行する前にファイル全体をメモリにロードするのが好きであり、このサイズのファイルでメモリの問題が発生する可能性があることです。

ファイルを読み取って、ファイルに含まれるデータを照会するだけで、ファイルを更新する必要はまったくありません。一部の XPath クエリは非常に複雑で、いくつかのレベルの親子型関係にまたがっています。これが、データをブロックとしてメモリにロードするのではなく、ストリーム リーダーを使用する機能に影響するかどうかはわかりません。

これを機能させる方法の 1 つは、ストリーム ベースのアプローチを使用して単純な分析を実行し、XPath ステートメントを XSLT 変換にラップして、後でファイルに対して実行できるようにすることです。ただし、少し複雑に思えます。

または、XPath クエリが実行されない要素がいくつかあることを知っているので、ドキュメントを元のツリー構造に基づいて一連の小さなフラグメントに分割できると思います。あまりにも多くの混乱を引き起こします。

ここで私の目的を説明しようとしたので、一般的なアプローチに関して完全に間違ったツリーを吠えている場合は、皆さんが私を正しく設定できると確信しています...

4

10 に答える 10

9

XPathReader が答えです。これは C# ランタイムの一部ではありませんが、Microsoft からダウンロードできます。ここにMSDN の記事があります。

XmlTextReader を使用して XPathReader を構築すると、XPath 式の利便性を備えたストリーミング読み取りの効率が得られます。

ギガバイト サイズのファイルでは使用したことがありませんが、数十メガバイトのファイルで使用したことがあります。これは通常、DOM ベースのソリューションを遅くするのに十分です。

以下からの引用: 「XPathReader は、ストリーミング方式で XML ドキュメントに対して XPath を実行する機能を提供します」。

マイクロソフトからダウンロード

于 2009-04-04T06:44:51.810 に答える
2

ギガバイトの XML ファイル!私はあなたにこの仕事をうらやましくない。

ファイルをより良い方法で送信する方法はありますか? たとえば、それらはネット経由であなたに送られていますか - もしそうなら、より効率的な形式が関係者全員にとってより良いかもしれません. ファイルをデータベースに読み込むことは悪い考えではありませんが、非常に時間がかかる可能性があります。

64ビットOSと大量のメモリがない限り、ファイル全体を読み取ってすべてをメモリ内で実行しようとはしません。ファイルが2、3、4GBになったら?

もう 1 つの方法は、XML ファイルを読み取り、SAX を使用してファイルを解析し、論理的な分割に従って小さな XML ファイルを書き出すことです。その後、これらを XPath で処理できます。私は 20 ~ 30MB のファイルで XPath を使用しましたが、非常に高速です。当初は SAX を使用する予定でしたが、XPath を試してみようと思ったところ、その速さに驚きました。開発時間を大幅に節約でき、おそらくクエリごとに 250 ミリ秒しか失われませんでした。私は解析に Java を使用していましたが、.NET でもほとんど違いはないと思います。

XML::Twig (Perl CPAN モジュール) は、SAX ベースの XPath 解析を処理するために明示的に記述されていることを読みました。別の言語を使用できますか?

これも役立つかもしれませんhttps://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1044772.html

于 2009-01-03T10:46:45.037 に答える
2

http://msdn.microsoft.com/en-us/library/bb387013.aspxには、XStreamingElement を活用した関連例があります。

于 2011-02-16T09:31:13.803 に答える
1

あなたはすでに使ってみたようですXPathDocument解析された xml ドキュメントをメモリに格納できませんでした

この場合、ファイルの分割を開始する前に (これは最終的には正しい決定です!)、Saxon XSLT/XQuery プロセッサを使用してみてください。これには、ロードされた XML ドキュメント ( 「tinytree」モデル)の非常に効率的なメモリ内表現があります。さらに、Saxon SA (無料ではない shema 対応バージョン) には、いくつかのストリーミング拡張機能があります。詳細については、こちらをご覧ください。

于 2009-01-02T17:27:53.697 に答える
1

あなたはすでにあなたの選択を概説しました。

XPath を放棄して XmlTextReader を使用するか、ドキュメントを XPath を使用できる管理可能なチャンクに分割する必要があります。

後者を選択した場合、XPathDocument を使用すると、その読み取り専用制限により、メモリをより有効に使用できます。

于 2009-01-02T16:49:02.433 に答える
1

標準の .NET クラスで XPath クエリを実行するには、ドキュメント ツリー全体をメモリにロードする必要があります。これは、最大で 1 ギガバイトかかる場合はお勧めできません。私見XmlReaderは、そのようなタスクを処理するための優れたクラスです。

于 2009-01-02T16:49:36.643 に答える
1

全体をデータベースに読み込んでから、一時データベースを操作するのはどうですか? これは、TSQL を使用してクエリをより効率的に実行できるため、より良い場合があります。

于 2009-01-02T18:38:33.913 に答える
1

ファイル全体ではなく小さなチャンクを読み取ることができる独自の xml パーサーを作成するか、大きなファイルを小さなファイルに分割し、これらのファイルで dotnet クラスを使用することが最善の解決策だと思います。問題は、データ全体が利用可能になるまで一部のデータを解析できないため、dotnet クラスではなく独自のパーサーを使用することをお勧めします

于 2009-01-03T11:14:44.277 に答える
0

XPathDocument を試してみましたか? このクラスは、XPath クエリを効率的に処理するために最適化されています。

XPathDocument を使用して入力ドキュメントを効率的に処理できない場合は、XmlReader を使用して入力ドキュメントを前処理または分割することを検討してください。

于 2009-01-02T16:48:50.763 に答える
0

あなたの場合、データサイズはGbsで実行できるため、XMLをデータベースとしてADO.NETを使用することを検討しました。それに加えて、メモリのフットプリントはそれほど大きくありません。

別のアプローチは、XElementStream のような要素を使用して Linq to XML を使用することです。お役に立てれば。

于 2010-03-19T19:11:54.217 に答える