4

大量のメモリを消費するプログラム (x64) があります。で実行してwin server 2008 R2 SP148 GB RAM(64 bit)ます.net frame work 4.5

app.configにも設定gcAllowVeryLargeObjects = trueしました。

プログラムを実行すると、18 GB のメモリが消費され、その後例外が発生します

EXCEPTION: System.OutOfMemoryException: Insufficient memory to continue the execution of the program.

   at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
   at System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
   at System.Text.StringBuilder.Append(String value)
   at System.Xml.XmlTextEncoder.Write(String text)
   at System.Xml.XmlTextWriter.WriteWhitespace(String ws)
   at System.Xml.XmlElement.WriteElementTo(XmlWriter writer, XmlElement e)
   at System.Xml.XmlNode.get_OuterXml()
   at System.Security.Cryptography.Xml.Utils.PreProcessElementInput(XmlElement e
   lem, XmlResolver xmlResolver, String baseUri)
   at System.Security.Cryptography.Xml.Reference.CalculateHashValue(XmlDocument
   document, CanonicalXmlNodeList refList)
   at System.Security.Cryptography.Xml.SignedXml.BuildDigestedReferences()
   at System.Security.Cryptography.Xml.SignedXml.ComputeSignature()

「メモリが不足しています」と表示されますが、まだ 30 GB の空きメモリがあります。このエラーが発生するのは、.net アプリケーションまたはサーバーの制限ですか。

4

2 に答える 2

4

StringBuilder クラスの内部制限に直面しています。 文字を超える文字列を生成することはできませんint.MaxValue。その制限は .NET ではかなり厳しい制限です。gcAllowVeryLargeObjects は役立ちますが、解決しません。中心的な問題は、文字列をインデックス化するのにint型が十分に大きくないことです。

この問題を解決するには、よりスマートなコードを作成する必要があります。これは、StringWriter の代わりに StreamWriter を使用して開始する必要があります。つまり、メモリではなくファイルに書き込みます。

マシンにあるすべての RAM を引き続き使用できます。ファイルは最初にファイル システム キャッシュに書き込まれます。プログラムが遅くなることはありません。

于 2013-09-30T09:49:11.640 に答える
0

これについての質問に明確な証拠がなくても、私の頭に浮かぶことが1つあります。

少しずつでも、コレクションBCLにはメモリ制限があることに注意してください。単一のコレクション インスタンスが割り当てることができる最大メモリ量は、両方のアーキテクチャでそれ以下です。List<T>32642GB

List<T>何らかのリークが発生した場合は、特に のタイプの使用を確認できます。

お役に立てれば。

于 2013-09-30T06:42:19.077 に答える