【问题标题】:PDFClown System.OutOfMemoryException while populating large file填充大文件时出现 PDFClown System.OutOfMemoryException
【发布时间】:2018-07-16 18:58:38
【问题描述】:

我正在使用 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();
}

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

【问题讨论】:

  • 报告是什么样的?里面有多少数据? 150 页 PDF 的 1.5GB 内存似乎很大。
  • Project > Properties > Build 选项卡,取消勾选“Prefer 32-bit”复选框。你不喜欢它。
  • 在 64 位执行中,内存最高为 3.6GB,最终文件大小为 359MB,文档中只有区区 153 页。

标签: c# out-of-memory pdfclown


【解决方案1】:

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

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

迁移到 64 位也有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2020-06-21
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多