C# 使用Report.Render()方法时发生OutOfMemoryException,尽管可用内存充足
调用Report.Render()方法()时,我们公司的一个客户机遇到定期OutOfMemoryException。尽管所有迹象表明操作系统在发生故障时有大量可用内存,但仍会发生这种情况。在这种情况下,报告被提供一个具有嵌入映像的RDLC文件。RDLC文件的大小为321KB 我们向相关进程添加了一些内存诊断:C# 使用Report.Render()方法时发生OutOfMemoryException,尽管可用内存充足,c#,asp.net,.net,C#,Asp.net,.net,调用Report.Render()方法()时,我们公司的一个客户机遇到定期OutOfMemoryException。尽管所有迹象表明操作系统在发生故障时有大量可用内存,但仍会发生这种情况。在这种情况下,报告被提供一个具有嵌入映像的RDLC文件。RDLC文件的大小为321KB 我们向相关进程添加了一些内存诊断: 在Render()方法调用之前,工作进程显示内存占用量约为412MB,尽管这个数量自然会有所不同。它从未见过超过600MB的容量。(这是使用GC.GetTotalMemory(false
- 在Render()方法调用之前,工作进程显示内存占用量约为412MB,尽管这个数量自然会有所不同。它从未见过超过600MB的容量。(这是使用GC.GetTotalMemory(false)确定的)
- 在Render()方法调用之前,操作系统会报告系统上的以下内存可用性(使用GlobalMemoryStatusEx函数()确定):
Microsoft.Reporting.WebForms.LocalProcessingException: An error occurred during local report processing. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: An unexpected error occurred in Report Processing. ---> System.OutOfMemoryException: Out of memory.
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at Microsoft.ReportingServices.Rendering.ImageRenderer.SharedRenderer.GetImage(RPLReport rplReport, Byte[]& imageData, Int64 imageDataOffset, GDIImageProps& gdiImageProps)
at Microsoft.ReportingServices.Rendering.ImageRenderer.PDFWriter.GetImage(String imageName, Byte[] imageData, Int64 imageDataOffset, GDIImageProps gdiImageProps)
at Microsoft.ReportingServices.Rendering.ImageRenderer.PDFWriter.DrawImage(RectangleF position, RPLImage image, RPLImageProps instanceProperties, RPLImagePropsDef definitionProperties)
at Microsoft.ReportingServices.Rendering.ImageRenderer.Renderer.ProcessImage(RPLMeasurement measurement, RectangleF position)
at Microsoft.ReportingServices.Rendering.ImageRenderer.Renderer.ProcessReportItem(RPLMeasurement measurement, RectangleF bounds, Boolean renderBorders, Boolean hasTablixCellParent)
at Microsoft.ReportingServices.Rendering.ImageRenderer.Renderer.ProcessNonTablixContainerReportItems(RPLContainer container, RectangleF bounds)
at Microsoft.ReportingServices.Rendering.ImageRenderer.Renderer.ProcessReportItem(RPLMeasurement measurement, RectangleF bounds, Boolean renderBorders, Boolean hasTablixCellParent)
at Microsoft.ReportingServices.Rendering.ImageRenderer.Renderer.ProcessPage(RPLReport rplReport, Int32 pageNumber, FontCache sharedFontCache, List`1 paragraphsItemizedData)
at Microsoft.ReportingServices.Rendering.ImageRenderer.PDFRenderer.Render(Report report, NameValueCollection deviceInfo, Hashtable renderProperties, CreateAndRegisterStream createAndRegisterStream)
at Microsoft.ReportingServices.Rendering.ImageRenderer.RendererBase.Render(Report report, NameValueCollection reportServerParameters, NameValueCollection deviceInfo, NameValueCollection clientCapabilities, Hashtable& renderProperties, CreateAndRegisterStream createAndRegisterStream)
at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.RenderReport(IRenderingExtension newRenderer, DateTime executionTimeStamp, ProcessingContext pc, RenderingContext rc, IChunkFactory cacheDataChunkFactory, IChunkFactory yukonCompiledDefinition, Boolean& dataCached)
运行此web应用的此应用程序池配置了私有内存限制、请求限制和虚拟内存限制值,所有这些值均设置为0(无限制)
在我们的代码中,在Render()方法调用之后,我们还调用以下命令以尝试释放报表生成占用的内存:
report.DataSources.Clear();
report.ReleaseSandboxAppDomain();
report.Dispose();
我欢迎对这个问题有任何想法或建议。你能帮我做一个简单的回答吗!转储堆。当您的报表太大时,可能会发生这种情况。玩内存管理几乎毫无用处。你的数据源是什么?可能你有太多的数据,你需要优化它。。。我目前在ActiveReport中也遇到了同样的问题,过滤器返回的数据太多,无法处理……这是32位还是64位的过程?@terrencep:这将是我下一步研究的途径之一,是的。贝斯特:我们只是从内存占用的角度来看数据,但实际上还没有深入研究数据本身。我来看看,你能帮我个忙吗!转储堆。当您的报表太大时,可能会发生这种情况。玩内存管理几乎毫无用处。你的数据源是什么?可能你有太多的数据,你需要优化它。。。我目前在ActiveReport中也遇到了同样的问题,过滤器返回的数据太多,无法处理……这是32位还是64位的过程?@terrencep:这将是我下一步研究的途径之一,是的。贝斯特:我们只是从内存占用的角度来看数据,但实际上还没有深入研究数据本身。我来看看。
report.DataSources.Clear();
report.ReleaseSandboxAppDomain();
report.Dispose();