c# - StringBuilder OutOfMemoryException 异常

标签 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;

最佳答案

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

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

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

如果你绝对必须使用纯文本,请考虑 StreamReaderStreamWriter直接类,因为它们不会抛出大小异常。请记住,流是为此类操作而设计的,StringBuilder 不是,因此您可以更轻松地使用流。

编辑:

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

关于c# - StringBuilder OutOfMemoryException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587957/

相关文章:

c# - Roslyn 从 InvocationExpression 获取方法声明

c# - 使用 C# 控制另一个应用程序

java - 为什么java regex模式错误出现在windows环境中而不是solaris环境中

exception - 即使不会造成任何伤害,代码是否应该阻止逻辑上无效的调用?

Php laravel内存限制错误

c# - 如何使用约束将 T 限制为值类型?

c# - 如何增加处理HTTP请求的数量?

c# - 如果我在 SqlConnection 的 using 语句中捕获异常,using 是否仍然处理关闭和处理我的连接?

java - 使用最大资源运行 jar 命令行

Java 在填满堆空间之前崩溃