0

我正在使用 PDFClown 使用数据库中的数据生成一个大型报告 pdf 文件。

该过程需要很长时间,并且当页面数接近 150 标记占用超过 1.5GB 的内存并出现错误时,最终会耗尽内存:

PDFClown.dll 中出现了“System.OutOfMemoryException”类型的第一次机会异常

因为我需要定期生成超过 1500 页的报告,所以这是一个主要问题。

有什么我可以做的:

  1. 不会耗尽内存(必需)
  2. 加快文件创建速度(理想情况下)

请注意:生成的报告(使用较小的数据集)是准确的,尽管文件大小相当大。

这是我的代码示例:

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();
}

屏幕截图示例报告页面(出于客户隐私原因而编辑): 示例报告页面

4

1 回答 1

1

函数:ReportFonts.GetFont(...)每次调用时都会创建一个新字体。然后将该字体存储在 dll 的内存空间中,最终文件占用了这么多空间。

使用 Dictionary<> 解决了这个问题,不仅内存空间干净,文件大小可以接受,而且执行时间也大大提高了。

迁移到 64 位也有所帮助。

于 2018-07-17T14:38:35.647 回答