我有一个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;
答案 0 :(得分:5)
OutOfMemory可能意味着您要为StringBuilder构建太大的字符串,而StringBuilder旨在处理非常不同类型的操作。
虽然我对如何使StringBuilder工作感到茫然,但让我指出一个不太可能失败的更直观的实现。
您可以使用直接二进制文件通过BinaryReader和BinaryWriter类从文件中读取和写入。这也可以为您节省大量精力,因为您可以确保序列化字节而不是字符串或整个单词。
如果绝对必须使用明文,请直接考虑StreamReader和StreamWriter类,因为它们不会抛出大小异常。请记住,流是用于这种操作,而StringBuilder则不是,所以Streams更有可能以更少的工作量工作。
编辑:
因此,这是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