StringBuilder OutOfMemoryException

时间:2014-05-11 01:18:28

标签: c# exception out-of-memory stringbuilder

我有一个StringBuilder,它附加了图像中的所有像素,这个数量非常大。每次我运行程序时,一切都顺利,但是一旦我改变像素颜色(ArGB),我在清除StringBuilder的地方得到一个OutOfMemoryException问题是我需要创建StreamWriter的实例,然后将文本添加到其中然后设置文件路径。| 我当前的代码:

StringBuilder PixelFile = new StringBuilder("", 5000);
Private void Render() 
{
//One second run, I get an OutOfMemoryException
PixelFile.Clear();
//This is in a for but cut it out for reverence. 
PixelFile.Append(ArGBFormat);
}

我不知道造成这种情况的原因。我尝试过PixelFile.Length = 0;PixelFile.Capacity = 0;

1 个答案:

答案 0 :(得分:5)

OutOfMemory可能意味着您要为StringBuilder构建太大的字符串,而StringBuilder旨在处理非常不同类型的操作。

虽然我对如何使StringBuilder工作感到茫然,但让我指出一个不太可能失败的更直观的实现。

您可以使用直接二进制文件通过BinaryReaderBinaryWriter类从文件中读取和写入。这也可以为您节省大量精力,因为您可以确保序列化字节而不是字符串或整个单词。

如果绝对必须使用明文,请直接考虑StreamReaderStreamWriter类,因为它们不会抛出大小异常。请记住,流是用于这种操作,而StringBuilder则不是,所以Streams更有可能以更少的工作量工作。

编辑:

  

When the maximum capacity is reached, no further memory can be allocated for the StringBuilder object, and trying to add characters or expand it beyond its maximum capacity throws either an ArgumentOutOfRangeException or an OutOfMemoryException exception.

因此,这是StringBuilder类的限制,无法用当前的实现来克服。

编辑:其他实施

除了可以直接写入文件的StreamWriters之外,您还可以使用MemoryStream类将信息传递到内存而不是磁盘。请注意,这可能会导致程序性能降低,我建议重新尝试重构该过程,只需要执行一次流。

话虽如此,仍有可能。

var mem = new MemoryStream();
var memWriter = new StreamWriter(mem);
// TODO: use memWriter.Write as per StreamWriter
mem.Position = 0;    // This ensures you are copying your stream from the beginning

// TODO: Show your file save dialog
var fileStream = new StreamWriter(fileNameFromDialog);
mem.CopyTo(fileWriter);    // Perform the copy