首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder OutOfMemoryException

StringBuilder OutOfMemoryException
EN

Stack Overflow用户
提问于 2014-05-11 01:18:27
回答 1查看 5.2K关注 0票数 2

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

代码语言:javascript
复制
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;

EN

回答 1

Stack Overflow用户

发布于 2014-05-11 01:34:53

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

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

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

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

编辑:

当达到最大容量时,将不再为StringBuilder对象分配更多内存,并且试图添加字符或将其扩展到其最大容量之外,会抛出ArgumentOutOfRangeException或OutOfMemoryException异常。

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

编辑:其他实现

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

尽管如此,这仍然是可能的。

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23587957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档