8

XmlDocumentノードをカウントするために、オブジェクトを使用して XML ドキュメントをロードするコードをいくつか作成しました。メソッドは次のとおりです。

XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
    number_of_childs++;
}

私が直面している問題は、大きなファイルをインポートするときに 700MB の RAM が必要になることです。次に、ファイルに対して何らかの操作を実行しようとしたり、ファイルから読み取ってデータを に表示しようとするとListView、アプリケーションは 2 GB の RAM を消費します。それで、私は疑問に思っていました.を閉じてXmlDocumentメモリを解放し、RAMを解放する方法はありますか. コンテンツをメモリから削除するのを忘れているようなものです。

4

3 に答える 3

17

いいえ。XmlDocumentクラスは を実装していないためIDisposable、リソースを自由に解放するように強制する方法はありません。で使用されているメモリをすぐに解放する必要がある場合XmlDocumentは、次のようにするしかありません。

nodes = null;
xml = null;
GC.Collect();

ガベージ コレクターは別のスレッドで動作するため、すぐには実行されない場合があります。ガベージ コレクションを強制的に同期的に発生させるには、コードの実行を続行する前に、次のように も呼び出す必要がありますWaitForPendingFinalizers

nodes = null;
xml = null;
GC.Collect();
GC.WaitForPendingFinalizers();

XmlDocument常に一度にドキュメント全体をメモリにロードします。ドキュメント内のノードをストリームとして反復処理し、一度に少しずつロードするだけの場合、それがXmlReaderクラスの目的です。ただし、その方法では多くの機能が失われます。たとえば、例で行っているように、XPath を介してノードを選択する方法はありません。ではXmlReader、ドキュメント内のどこにいるのか、それが探しているものと一致するかどうかを判断するために、独自のロジックを記述する必要があります。

于 2012-06-13T13:38:01.437 に答える
2

オブジェクトをnullに設定する必要はありません。GCは、ドキュメントがそれ自体でそれ以上使用されていないかどうかを示すことができるはずです。これはメモリが必要になると自動的に発生しますが、メモリをクリアしたい場合はすぐにGC.Collect()を呼び出します。詳細については、このスレッドを参照してください。

于 2012-06-13T13:47:57.747 に答える
1

XML を操作する必要がない場合は、 XMLReaderを使用して XML を読み取るだけです。これは一方向で最速であり、メモリ負荷の少ない操作です。

于 2012-06-13T13:34:57.980 に答える