StringBuilder OutOfMemoryException

Ryn*_*h97 1 c# stringbuilder exception out-of-memory

我有一个StringBuilder,它附加图像中的所有像素,这个数量非常大.每次我运行我的程序时,一切都顺利,但是一旦我改变了像素颜色(ArGB),我得到了一个OutOfMemoryException清除StringBuilder的地方.问题是我需要创建一个实例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);
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*vid 5

OutOfMemory可能意味着你为StringBuilder构建的字符串太大了,而StringBuilder旨在处理一种非常不同类型的操作.

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

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

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

编辑:

当达到最大容量,没有进一步的存储器可以分配为StringBuilder对象,并尝试添加字符或扩大其超过其最大容量要么抛出一个ArgumentOutOfRangeException或OutOfMemoryException异常.

因此,这是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
Run Code Online (Sandbox Code Playgroud)