C# 为什么StringBuilder可以';不要拿着巨大的绳子,扔东西

C# 为什么StringBuilder可以';不要拿着巨大的绳子,扔东西,c#,out-of-memory,stringbuilder,C#,Out Of Memory,Stringbuilder,我正在使用iTextSharp XMLWorker将HTML字符串转换为PDF。以前,这工作正常,生成了漂亮的pdf文件,但后来我在HTML字符串中添加了base64字符串图像,我想在pdf中显示它。它对少数图像(小字符串)工作正常,但当图像数量平行增加时,字符串的大小会增加。我从这样的函数返回HTML字符串 sb = new StringBuilder(); tw = new StringWriter(sb); hw = new HtmlTextWriter(tw); tblDistrictw

我正在使用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 sb=新建StringBuilder();
sbFooter=新的StringBuilder();
tw=新的StringWriter(sbFooter);
hw=新的HtmlTextWriter(tw);
tblFooter.渲染控制(hw);
字符串pdfString=GetPDFString(paperCode,paperName,true)//这是函数返回的字符串
sb.Append(pdfString+“
”+sbFooter.ToString())//包含返回的字符串和页脚字符串并保存在另一个stringbuilder中(这里我得到了OOM异常)
字符串变得非常大,但没有超过StringBuilder的最大容量

请有人帮帮我


编辑:我使用的是VS2010(32位)和DEV Server 32位。NET的内存限制取决于运行的二进制文件。而那些距离操作系统限制还有一段距离的公司,更不用说硬件限制了:

加上2 GiB对象限制。字符串或数组(我打赌string builder使用的)很快就会遇到对象大小或内存限制

默认情况下,所有.NET代码都是位无关的。同样的代码可以作为x32或x64运行,甚至可以作为x16或x128运行,如果我们有运行时的话。将进程修复为仅在x64二进制上运行可以解决当前的问题。然而,更大的问题是过程本身:

字符串很容易突破内存限制。但他们在图像上什么都没有。图像是巨大的!它们是BLOB(二进制大对象)的书籍示例,这是一个需要保存在内存中的可怕的东西


Base64编码使其体积增大了33%。如果你试图在内存中保存一个包含如此巨大字符串的整个PDF文档,你只会遇到问题。这是一个奇迹,它迄今为止的工作。您需要更改进程,以便在内存中获得更大的字符串。Wich实际上可能意味着更少的连接,Wich甚至可能会使必须首先使用StringBuilder无效。

.NET的内存限制取决于运行的二进制文件。而那些距离操作系统限制还有一段距离的公司,更不用说硬件限制了:

加上2 GiB对象限制。字符串或数组(我打赌string builder使用的)很快就会遇到对象大小或内存限制

默认情况下,所有.NET代码都是位无关的。同样的代码可以作为x32或x64运行,甚至可以作为x16或x128运行,如果我们有运行时的话。将进程修复为仅在x64二进制上运行可以解决当前的问题。然而,更大的问题是过程本身:

字符串很容易突破内存限制。但他们在图像上什么都没有。图像是巨大的!它们是BLOB(二进制大对象)的书籍示例,这是一个需要保存在内存中的可怕的东西


Base64编码使其体积增大了33%。如果你试图在内存中保存一个包含如此巨大字符串的整个PDF文档,你只会遇到问题。这是一个奇迹,它迄今为止的工作。您需要更改进程,以便在内存中获得更大的字符串。Wich实际上可能意味着更少的连接,Wich甚至可能会使必须首先使用StringBuilder无效。

“以前这工作正常,生成了漂亮的pdf文件,但后来我将base64字符串图像添加到我的HTML字符串中,我想在我的pdf中显示它。”这与你的内存无关。然后进行Base64编码的图像将破坏它你应该尽量不要一次完成整个文档。也许一章一章?这能回答你的问题吗?请注意,当您在调用sb.Append之前用“+”将所有三个字符串连接在一起时,您将在单个内存块中短暂地占用三个字符串的全部空间,然后调用sb.Append,这将添加另一个大小相等的内存块(平均)到StringBuffer,同时仍然通过其参数保留对第一个的引用,然后只有在Append方法返回后,第一个块才会被释放用于GC。在调用Append之前,最好对每个片段进行三次Append调用,而不是将它们连接起来。尝试创建32位应用程序。可以解决这个问题。看看怎么做。另外,考虑一下这里的第一个评论。如果你的代码是32位的话,我的机器是64位。32位代码的总内存限制为2GB,除非您启用了@JQSOFT提到的LargeAddressWare(IIRC将其扩展到3GB)。您的计算机可能是64位的,内存为12 TB,并且不会改变32位代码允许的限制。“以前这工作正常,生成了很好的pdf文件,但后来我在HTML字符串中添加了base64字符串图像,我想在pdf中显示它。”这与内存无关。然后进行Base64编码的图像将破坏它你应该尽量不要一次完成整个文档。也许一章一章?这能回答你的问题吗?请注意,当您在调用sb.Append之前用“+”将所有三个字符串连接在一起时,您将在单个内存块中短暂地占用三个字符串的全部空间,然后调用sb.Append,这将添加另一个大小相等的内存块(平均)到StringBuffer,同时仍然通过其参数保留对第一个的引用,然后只有在Append方法返回后,第一个块才会被释放用于GC。在调用Append之前,最好对每个片段进行三次Append调用,而不是将它们连接起来。尝试创建32位应用程序。能够