0

xml のファイル サイズに基づいて XpathDocument インスタンスを作成するためのメモリ要件を見積もる方法はありますか?

XpathDocument xdoc = new XpathDocument(xmlfile);

メモリが非常に低いレベルに低下した場合、XpathDocument の作成プロセスをプログラムで停止する方法はありますか?

xml 全体をメモリにロードするため、xml が大きすぎるかどうかを事前に把握しておくと便利です。私が見つけたのは、大きな xml ファイルを使用して新しい XpathDocument を作成すると、メモリ不足の例外が発生することはありませんが、プロセスが遅くなり、使用可能なメモリが 5 Mb しか残っておらず、タスク マネージャーがそうでないと報告することです。応答します。これは、584 Mb の RAM があるときに 266 Mb の xml ファイルで発生しました。18で150Mbのファイルを問題なく読み込めました。

xml を読み込んだ後、XpathNavigator と XpathNodeIterator を使用して xpath クエリを実行したいと考えています。私は.net 2.0、XP SP3を使用しています。

4

3 に答える 3

2

要するに、見積もりを開始する前に静的データを収集するための同様のファイルが常にある場合を除いて、できません。

タグ、属性、接頭辞、名前空間の文字列はインターンされているため、ストレージの効率は XML ファイルの構造に大きく依存し、ディスク上のファイルと比較した比率は、使用するエンコーディングにも依存します。

一般に、.NET はすべての文字列を UTF16 としてメモリに格納します。したがって、大きな構造上のオーバーヘッドがなくても (ルート タグが 1 つしかなく、その中に多数のプレーン テキストが含まれる XML ファイルを想像してください)、UTF8 ソース ファイル (または ASCII またはその他の 8-ビットエンコーディング)が使用されます。したがって、文字列のエンコードは方程式の最初の部分です。

もう 1 つのことは、ドキュメントを効率的にトラバーサルできるように、データ構造がメモリ内に構築されることです。通常、ノードは作成され、参照とともにリンクされます。したがって、各ノードは一定量のメモリを使い果たします。ほとんどの非値データは参照であるため、ここで使用されるメモリもアーキテクチャに大きく依存します (64 ビットでは、1 つの参照に対して 32 ビット システムの 2 倍のメモリが使用されます)。そのため、データがほとんどない非常に複雑なドキュメント (たとえば、テキストや属性値がほとんどないいくつかの異なるタグがたくさんある) がある場合、メモリ使用量は元のドキュメント サイズよりもはるかに多くなり、これはファイルのサイズにも大きく依存します。アプリケーションが実行されるアーキテクチャ。

非常に長いタグ名と属性名がほとんどなく、おそらくデフォルトの名前空間の使用量が多いファイルがある場合、使用されるメモリもディスク上のファイルよりもはるかに少なくなる可能性があります。

そのため、エンコーディングが不明で、妥当な量のデータと複雑さを持つ任意の XML ファイルを想定すると、信頼できる見積もりを得るのは非常に困難です。ただし、言及されている点で XML ファイルが常に類似している場合は、いくつかの統計を作成して、特定のプラットフォームに適した比率を取得する要因を取得できます。

ただし、タスク マネージャーで「空きメモリ」を見たり、「非常に低いメモリ レベル」について話したりすることは、非常にあいまいな定量化であることに注意してください。仮想メモリ、キャッシュ、バックグラウンド アプリケーションおよびサービスなどは、効果的な生メモリの可用性に影響します。したがって、.NET Framework は、1 つのプロセスのパフォーマンスを維持するために、または OutOfMemoryException を安全にスローする前に、使用できるメモリの量を確実に推測できません。そのため、これらの例外のいずれかを受け取った場合、通常はアプリケーションの回復ポイントをはるかに超えているため、それらの例外をキャッチして処理しようとしないでください。

于 2010-12-30T02:24:07.907 に答える
0

はい、確かに FileInfo クラスでそれを行うことができます。

System.IO.FileInfo foo = new System.IO.FileInfo("<your file path as string>"); 
long Size = foo.Length;
于 2010-12-30T01:55:53.393 に答える
0

ファイルサイズを確認して、特定の上限を超えている場合は取り消すことができます。

var xmlFileInfo = new FileInfo(xmlfile);
var isTooBig = xmlFileInfo.Length > maximumSize

正しい最大サイズを推測できないため、これは絶対確実ではありません。

于 2010-12-30T01:54:43.490 に答える