C# 填充大文件时发生PDFClown System.OutOfMemoryException
我正在使用数据库中的数据,使用PDFClown生成一个大型报告pdf文件 该过程需要很长时间,当页数接近150标记时,最终会耗尽内存,占用超过1.5GB的ram,并出现以下错误: PDFClown.dll中发生类型为“System.OutOfMemoryException”的第一次意外异常 由于我需要定期生成超过1500页的报告,这是一个主要问题 我能做些什么:C# 填充大文件时发生PDFClown System.OutOfMemoryException,c#,out-of-memory,pdfclown,C#,Out Of Memory,Pdfclown,我正在使用数据库中的数据,使用PDFClown生成一个大型报告pdf文件 该过程需要很长时间,当页数接近150标记时,最终会耗尽内存,占用超过1.5GB的ram,并出现以下错误: PDFClown.dll中发生类型为“System.OutOfMemoryException”的第一次意外异常 由于我需要定期生成超过1500页的报告,这是一个主要问题 我能做些什么: 没有耗尽内存(必要) 加快文件创建速度(理想情况下) 请注意:生成的报告(使用较小的数据集)是准确的,尽管文件大小相当大 以下是我的代
protected void PopulateReport()
{
foreach (Page page in _lstPages)
{
if (page != _Titlepage)
{
PrimitiveComposer composer = new PrimitiveComposer(page);
BlockComposer blockComposer = new BlockComposer(composer);
DataRow drInspection;
if (_mapPage1Rows.TryGetValue(page, out dataRow))
{
GeneratePage1(page, composer, blockComposer, dataRow);
}
else if (_mapPage2Rows.TryGetValue(page, out dataRow))
{
GeneratePage2(page, composer, blockComposer, dataRow);
}
}
}
}
protected void GeneratePage1()
{
composer.BeginLocalState();
composer.SetFont(ReportFonts.GetFont(GetPDFDocument(), bIsFieldName, false), nFontSize);
blockComposer.Begin(GetRectangle(fMarginX, fMarginY, fWidth, nFontSize), AlignX, AlignY);
int nIndex = blockComposer.ShowText(strText, false);
blockComposer.End();
....
composer.End();
composer.Flush();
}
屏幕截图示例报告页面(出于客户隐私原因而编辑):
函数:
ReportFonts.GetFont(…)
每次调用时都会创建一种新字体。
这种字体随后被存储在dll的内存空间和最终文件中,而最终文件占用了如此多的空间
使用字典解决了这个问题,不仅内存空间干净,文件大小可以接受,而且执行时间也大大提高
迁移到64位也有所帮助。报告是什么样子的?里面有多少数据?150页PDF的1.5GB内存似乎很大。项目>属性>构建选项卡,取消选中“首选32位”复选框。在64位执行中,内存最高为3.6GB,最终文件大小为359MB,文档中仅有153页。