Hi There,
We Telerik Reporting version to convert a data set in csv format and exporting it to PDF format.
There are around 41,000 rows in the csv file. And it generates around 1,000 pages in PDG format.
controls used in the report are only csvDataSource, crosstab and textbox. No images used.
There are 2 groups, by store and then fiscal month. They are used for the bookmarks in PDF format report.
It takes much time generates the report and receiving System.OutOfMemoryException while exporting the report to PDF.
But if I reduce the number of records in the source csv file, I'm able to export the data to PDF, so the code is working.
The requirement is to generate all data in one single PDF report as it's enterprise level report, filter/ report parameter is not an option in this case.
See attached screenshot of the error message.
Can anyone know this issue and give some suggestions?
Thanks a lot!
Susie
8 Answers, 1 is accepted
Here is the error message along with the screen shot of physical memory status in the server:
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException'
was thrown.
at
System.Windows.Forms.Internal.DeviceContexts.AddDeviceContext(DeviceContext dc)
at
System.Windows.Forms.Internal.DeviceContext..ctor(IntPtr hDC, DeviceContextType
dcType)
at
System.Windows.Forms.Internal.WindowsGraphics.FromHdc(IntPtr hDc)
at
System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.ColorOptions.Calculate()
at
System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker(PaintEventArgs
e, Boolean up, CheckState state)
at System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp(PaintEventArgs
e, CheckState state)
at
System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint(PaintEventArgs
pevent)
at
System.Windows.Forms.ButtonBase.OnPaint(PaintEventArgs pevent)
at
System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16
layer)
at
System.Windows.Forms.Control.WmPaint(Message& m)
at
System.Windows.Forms.Control.WndProc(Message& m)
at
System.Windows.Forms.ButtonBase.WndProc(Message& m)
at
System.Windows.Forms.Button.WndProc(Message& m)
at
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at
System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at
System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr
wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.18444 built by: FX451RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
MyTestReportHostForm
Assembly Version:
1.0.0.0
Win32 Version:
1.0.0.0
CodeBase:
file:///D:/Test/Debug/MyTestReportHostForm.exe
----------------------------------------
System.Windows.Forms
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.34251 built by: FX452RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.34270 built by: FX452RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.34238 built by: FX452RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
Telerik.Reporting
Assembly Version:
11.1.17.503
Win32 Version:
11.1.17.503
CodeBase:
file:///D:/Test/Debug/Telerik.Reporting.DLL
----------------------------------------
Telerik.ReportViewer.WinForms
Assembly Version:
11.1.17.503
Win32 Version:
11.1.17.503
CodeBase:
file:///D:/Test/Debug/Telerik.ReportViewer.WinForms.DLL
----------------------------------------
System.Configuration
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.18408 built by: FX451RTMGREL
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.34234 built by: FX452RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Core
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.18408 built by: FX451RTMGREL
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
Accessibility
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.18408 built by: FX451RTMGREL
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
System.Data
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.18408 built by: FX451RTMGREL
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Web
Assembly Version:
4.0.0.0
Win32 Version:
4.0.30319.34280 built by: FX452RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Web/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Web.dll
----------------------------------------
ReportLibrary1
Assembly Version:
1.0.0.0
Win32 Version: 1.0.0.0
CodeBase:
file:///D:/Test/Debug/ReportLibrary1.DLL
----------------------------------------
Anonymously Hosted DynamicMethods Assembly
Assembly Version:
0.0.0.0
Win32 Version:
4.0.30319.18444 built by: FX451RTMGDR
CodeBase:
file:///C:/Windows/Microsoft.Net/assembly/GAC_32/mscorlib/v4.0_4.0.0.0__b77a5c561934e089/mscorlib.dll
----------------------------------------
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for
this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.
I believe the error is the same as in http://docs.telerik.com/reporting/troubleshooting-windows-forms-report-viewer#-an-error-has-occurred-while-rendering-the-report-system-runtime-interopservices-externalexception-a-generic-error-occurred-in-gdi-or-system-outofmemoryexception-exception-of-type-system-outofmemoryexception-was-thrown-error-on-displaying-a-report
It is a result from the Image rendering used by the WinForms ReportViewer control.
In general, the Table/List/Crosstab item is rendered into a single continuous page and if the elements are too many, the GDI may not be able to handle the image generation. Test switching the viewer's ViewMode to PrintPreview and/or export programmatically the report.
Regards,
Stef
Progress Telerik
Hi Stef,
I tried to generate the PDF Programmatically. But still getting the same error message.
See attached screen shot.
Is there a way we can save cache to a file in the hard driver instead of memory? I updated the config file as below, but it seems never looked to the config file when the application runs.
Thanks,
Susie
app.config file:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="Telerik.Reporting" type="Telerik.Reporting.Configuration.ReportingConfigurationSection, Telerik.Reporting, Version=11.1.17.503, Culture=neutral, PublicKeyToken=a9d7983dfcc261be" allowLocation="true" allowDefinition="Everywhere" />
</configSections>
<Telerik.Reporting>
<Cache provider="File" BasePath="C:\Temp\" />
<cache provider="File" BasePath="C:\Temp\"/>
<assemblyReferences>
<add name="ReportLibrary1" version="1.0.0.0" />
</assemblyReferences>
<SessionState provider="" />
<restReportService>
<storage provider="" />
<reportResolver provider="" />
</restReportService>
<extensions>
<render>
<extension name="PDF">
<parameters>
<parameter name="JavaScript" value="app.execMenuItem('ShowHideBookmarks')" />
</parameters>
</extension>
</render>
</extensions>
</Telerik.Reporting>
</configuration>
In such case, the data and the report processing cannot be handled by the machine. In general, the report processing keeps the retrieved data and all generated resources in memory until the rendering ends. Thus you need to reduce the amount of data processed in a report at once, or to assure the machine has enough CPU and memory to handle the document generation.
Please post the code for generating the report in order to check its settings and to suggest you changes which can improve the performance.
Regards,
Stef
Progress Telerik
Hi Stef,
The testing server which is hosting the report generation part do have enough CPU (4)and physical memory(20GB). When the error comes CPU usage is around 50% and Memory usage is only 35%.
Is there a way I can send you the report design code? Maybe you can help us to improve the performance? I'm not able to attach the zip file here.
Below is the code to export report to PDF:
private void ExportToPDF(Telerik.Reporting.Report reportToExport)
{
ReportProcessor reportProcessor = new ReportProcessor();
Telerik.Reporting.InstanceReportSource instanceReportSource = new Telerik.Reporting.InstanceReportSource();
instanceReportSource.ReportDocument = reportToExport;
RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, null);
string fileName = "Test_Report_" + System.DateTime.Today.ToString("ddMMyyyy") + "." + result.Extension;
string path = System.IO.Path.GetTempPath();
string filePath = System.IO.Path.Combine(path, fileName);
using (System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
{
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
}
Do you have any idea on the app.config file I was talking about above? Instead of rendering into memory, can we use a file?
The configuration settings you posted are related to the Reporting Engine's cache mechanism.
If there are images during the processing or you render in a multi-document format like HTML, ready resources are placed in the file system or in a database (depends on the cache configuration).
In the case of Image rendering (the preview of the WinForms ReportViewer and the available Report Designers), and PDF rendering that is based on the Image rendering, there are little to no resources which will be placed physically on the machine.
We are planning changes which will improve the performance in R3 2017 (September 14th).
For the time being, you can test splitting the data and creating smaller PDF files or to export asynchronously.
Please feel free to open a support ticket and to send us the problematic report to check its settings for possible optimizations.
Regards,
Stef
Progress Telerik
Hi Telerik team,
we have a similar issue with Silverlight and get an Out of memory exception when trying to show a pdf preview of large data. We are using version 9.2.15.930 of telerik, could you let us know if the later versions than we have handles larger amount of data?
Thank you,
Roshan
We have improved the overall performance up to 25% in all supported document formats starting with Telerik Reporting R3 2017 (version 11.2.17.913) . Check also Sneak Peek: New Features in Telerik Reporting R3 Beta 1 blog post.
Note that we have introduced memory usage optimization for the PDF rendering extension, which implies better handling of larger data amounts.
Regards,
Todor
Progress Telerik