StringBuilder OutOfMemoryException

本文关键字:OutOfMemoryException StringBuilder | 更新日期: 2023-09-27 18:02:47

我有一个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;

StringBuilder OutOfMemoryException

OutOfMemory可能意味着您构建的字符串对于StringBuilder来说太大了,StringBuilder是用来处理一种非常不同类型的操作的。

当我不知道如何使StringBuilder工作时,让我为您指出一个更直观的实现,它将不太可能失败。

你可以通过BinaryReader和BinaryWriter类直接从文件中读写二进制文件。这也可以为您节省很多精力,因为您可以确保序列化的是字节,而不是字符串或整个单词。

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

编辑:

当达到最大容量时,不能再为StringBuilder对象分配内存,并且尝试添加字符或扩展它超过其最大容量会抛出ArgumentOutOfRangeException或OutOfMemoryException异常。

因此,这是StringBuilder类的一个限制,不能用您当前的实现来克服。

编辑:附加实现

除了可以直接写入文件的streamwriter之外,你还可以使用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
相关文章:
  • 没有找到相关文章