【问题标题】:SSRS - OutOf MemoryException - is there a limit to the number of rows that can be displayedSSRS - OutOfMemoryException - 可以显示的行数是否有限制
【发布时间】:2010-10-07 05:56:50
【问题描述】:

我创建了一个 rdl 文档,它指向一个返回 90 000 行的 proc,但我遇到了内存不足的异常。报表项目可以处理的行数是否有限制?

目前,我已将驱动我的报告的 proc 更改为仅选择 Top 90 000。我的规范是能够创建包含 120 000 行的报告。我的报告是一个矩阵。

我发誓上周我生成了一个包含 106800 行的报告,但现在我突然不能了。

我已经编写了一个渲染扩展,这是我进入代码时出现的部分异常。

电子信息:2/12/2009 12:03:53 PM prairieFyre.ReportActions.RenderReport:错误渲染报告 Microsoft.Reporting.WinForms.LocalProcessingException:错误 在本地报告处理期间发生。 ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: 报告处理中出现意外错误。 ---> System.OutOfMemoryException:类型异常 'System.OutOfMemoryException' 被抛出。在 System.IO.MemoryStream.set_Capacity(Int32 值)在 System.IO.MemoryStream.EnsureCapacity(Int32 值)在 System.IO.MemoryStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 计数) 在 System.IO.BinaryWriter.Write(String value) 在 Microsoft.ReportingServices.ReportProcessing.Persistence.IntermediateFormatWriter.ReportServerBinaryWriter.WriteString(字符串 字符串值) ....

【问题讨论】:

    标签: reporting-services matrix max rows rdl


    【解决方案1】:

    【讨论】:

    • 请在这篇文章中描述所需的步骤,否则可能会被删除为"Not an Answer"。如果您愿意,您仍然可以包含该链接,但仅作为“参考”。另请注意,您必须披露您指向的链接是否是您自己的博客/网站。
    • 这个链接帮助我解决了报告中奇怪的问题,那就是我必须将交互高度设置为 0。所以在其他情况下,但它有所帮助。
    【解决方案2】:

    堆栈表明用于存储报表执行结果的MemoryStream不能增加(加倍)它的大小。

    这通常是地址空间碎片造成的,一般不能通过添加硬件来解决。

    Microsoft ReportViewer 可以处理的数据量受到限制,因为它旨在将中间报告执行结果存储在 MemoryStream 中,不幸的是,它需要二次增长量的连续可用地址空间,这在通常的 .NET 应用程序中( 2GB 地址空间)不大于 256MB,而且通常比这小得多。

    例如,在此流中,存储了所有字段值、聚合值、表达式和图像,因此大小直接取决于添加到报表中的数据集的大小。

    要分析 .NET 应用程序的地址空间和对象,最好使用 WinDBG(Windows 调试工具)和 SOS 扩展进行调试。

    分析地址碎片的有用命令是:

    • !address -summary
    • lm
    • !EEHeap -gc
    • !DumpHeap -stat

    在这种特殊情况下,可以通过预先聚合已经在数据源中而不是在矩阵中的值来减少数据量。

    知识库文章“使用 SQL Server Reporting Services 时可能会收到 'System.OutOfMemoryException' 错误消息”[1] 提供了更多提示。

    [1]:http://support.microsoft.com/kb/909678使用 SQL Server Reporting Services 时出现“System.OutOfMemoryException”错误消息

    【讨论】:

      【解决方案3】:

      除了您的硬件配置外,我认为没有限制。如果您在 32 位机器上,正在处理它的工作进程有不到 2 GB 的内存可供使用,当您考虑内核模式内存时,可能接近 1 GB。如果您要提供像这样的大型报告,您可能需要一个 64 位设置,在盒子上至少有 4 GB 或更多内存。此设置将允许工作进程分配超过 2 GB 的可用内存来完成这些大型请求而不会出现问题。

      如果硬件升级不是一个选项,您也可以考虑这些替代方案。

      • 您说该报告是一个矩阵报告,所以听起来您并没有向用户显示所有数据,而是聚合它。你能在数据库中预先聚合一些这些数据,然后只使用 SSRS 进行显示吗?

      • 由于报表只不过是一个 XML 文件,因此可以从 SQL Server 中或使用某些脚本或进程构建报表 XML 字符串。这可能需要做很多工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-18
        相关资源
        最近更新 更多