StringBuilder.ToString() throws exception OutOfMemoryException

J'ai créé une StringBuilder de longueur "132370292", quand j'essaie d'obtenir de l'aide de la chaîne de la ToString() méthode il jette OutOfMemoryException.

StringBuilder SB = new StringBuilder();

for(int i =0; i<=5000; i++)
{
    SB.Append("Some Junk Data for testing. My Actual Data is created from different sources by Appending to the String Builder.");
}

try
{
    string str = SB.ToString(); //Throws OOM mostly
    Console.WriteLine("String Created Successfully");
}
catch(OutOfMemoryException ex)
{
    StreamWriter sw = new StreamWriter(@"c:\memo.txt", true);
    sw.Write(SB.ToString()); //Always writes to the file without any error
    Console.WriteLine("Written to File Successfully");
}

Quelle est la raison de l'OOM lors de la création d'une nouvelle chaîne et pourquoi il ne jette pas OOM lors de l'écriture dans un fichier?

Détails d'une Machine 64 bits, Windows 7, 2 go de RAM, .NET version 2.0

Quel est le contenu de mytext? Et pourquoi écrivez-vous à un StringBuilder si et puis à un flux? Pourquoi pas le flux directement en utilisant un StringWriter?
Pourquoi cette longueur exagérée? Vous venez réservés 126 MO de mémoire.
Pouvez-vous poster le code de votre programme?
Mon code est très différente, je suis de la création de la StringBuilder à partir de différentes sources en Ajoutant les valeurs, et la Longueur finale de la SB est "132370282". SB.ToString() fonctionne très bien, à certains moments, et ne parvient pas, à certains moments.
C'est 252MB; pourquoi voulez-vous une 252MB chaîne? Cela semble un incroyablement mauvaise idée - vous devrait vraiment être écrit à l'auteur ( sw ), cumulativement, - et non de la construction de la chose entière dans la mémoire. (/cc @DebugErr juste à noter que c'est 252MB, pas 126MB)

OriginalL'auteur Thiru | 2014-07-29