为什么StringBuilder无法容纳巨大的字符串并抛出OOM异常

问题描述 投票:2回答:1

我正在使用iTextSharp XMLWorker将HTML字符串转换为PDF。以前,此方法工作正常,并生成了不错的pdf文件,但后来我向我的HTML字符串中添加了base64字符串图像,该图像要在PDF中显示。对于很少的图像(小字符串)来说,它工作正常,但是当图像数量平行增加时,字符串的大小也会增加。我从类似这样的函数返回HTML字符串

sb = new StringBuilder();
tw = new StringWriter(sb);
hw = new HtmlTextWriter(tw);
tblDistrictwiseResults.RenderControl(hw);
return sb.ToString();

现在返回的HTML字符串将追加到另一个字符串,如下所示

StringBuilder sb = new StringBuilder();

sbFooter = new StringBuilder();
tw = new StringWriter(sbFooter);
hw = new HtmlTextWriter(tw);
tblFooter.RenderControl(hw);


string pdfString = GetPDFString(paperCode, paperName, true);  //This is the string returned from anothe function
sb.Append(pdfString + "<br />" + sbFooter.ToString()); //concatinating returned string and footer string and saving in another stringbuilder( here I am gettiong OOM Exception )

并且字符串变得非常大,但没有超过StringBuilder的最大容量。

请有人帮我

编辑:我正在使用VS2010(32位)和DEV Server 32位

c# out-of-memory stringbuilder
1个回答
0
投票

。NET具有内存限制,具体取决于您运行的二进制数。而联盟则少于操作系统限制,请不要忽略硬件限制:https://docs.microsoft.com/en-us/windows/win32/memory/memory-limits-for-windows-releases

加上2 GiB对象限制。字符串或数组(我敢打赌我会打赌使用字符串生成器使用)众所周知地很快会遇到对象大小或内存限制。

默认情况下,所有.NET代码都是不可知的。如果我们获得了运行时,则相同的代码可以作为x32或x64-甚至x16或x128运行。修复仅在x64二进制上运行的过程可以解决当前的问题。但是,更大的问题是进程本身

图像很大。它们是BLOB-二进制大对象的书示例。 Base64编码使它们大33%。然后,如果您尝试将此类巨型字符串的整个PDF文档保留在内存中,则只会遇到问题。您需要更改流程,以便在内存中使用更小的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.