C# 填充大文件时发生PDFClown System.OutOfMemoryException

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页的报告,这是一个主要问题 我能做些什么: 没有耗尽内存(必要) 加快文件创建速度(理想情况下) 请注意:生成的报告(使用较小的数据集)是准确的,尽管文件大小相当大 以下是我的代

我正在使用数据库中的数据,使用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页。