1

これはおそらく、 .NET コレクションとラージ オブジェクト ヒープ (LOH)に沿ったものです。

.Net では、xml が base64 に変換されるときに ~200KB のテキスト ドキュメントを作成する文字列を含む XmlDocument を読み込んでいます。ポイントは、文字列を大きなオブジェクト ヒープに割り当てる必要があることです。ここでの比較を読むと、XmlReader が文字列を読み取る最も効率的な方法であることがわかりますが、XmlDocument はおそらく、より多くの機能 (xpath) を使用して、より簡単に読み取ることができます。

私の XML の各ノードは、かなり小さな文字列である必要があり、大きなオブジェクト ヒープにはほど遠いものです。Lutz .Net Reflector を使用すると、XmlDocument が内部的にリンクされたノードを使用しているように見えます。

最後に、私の質問: ~200 KB (>85000 バイト) を節約するこの文字列をロードすると、XmlDocument の使用時にさらに別のオブジェクトが LOH に発生します。ヒープが断片化して OOM エラーが発生することが少し心配です。それとも、XmlDocument がたまたま (少なくとも私が求めているデータの場合)、マネージ ヒープに多くのオブジェクトを作成するのでしょうか?

4

2 に答える 2

3

大きなオブジェクト ヒープになるのは、85 kB を超える連続データの唯一のオブジェクトです。たとえば、1 万個の要素を持つ大きな文字列や配列などです。

XmlDocument は多数の小さなオブジェクトで構成されているため、大きなオブジェクト ヒープに何かを割り当てることはほとんどありません。その唯一の可能性は、ノードに数万の子が含まれている場合、または値が 42500 文字を超えている場合です。

于 2009-07-17T22:45:11.983 に答える
1

そもそもなぜXMLを文字列にロードするのですか?データはどこから来ていますか?最初にそれ(たとえば、StreamまたはTextReader)を直接に渡すことはできませんXmlDocumentか?

于 2009-07-17T20:24:52.920 に答える