找回密码
 立即注册

QQ登录

只需一步,快速开始

sunyuanze

注册会员

21

主题

66

帖子

169

积分

注册会员

积分
169

活字格认证微信认证勋章

sunyuanze
注册会员   /  发表于:2011-10-12 10:24  /   查看:8793  /  回复:8
产品版本:PowerTools ActiveReports for .NET 6.0J Professional
产品模块:PdfExport.Export
操作系统:WindowsXP SP3
IDE:Microsoft Visual Studio 2005 Professional Edition SP2
问题描述:
每条记录需要出力多个模板,当纪录数比较大的时候,占用内存非常大,导致出力失败。
我们做了如下测试:
如果每条记录按照2个模板出力(模板中包含较大图片),则出力20条左右纪录时内存占用达到2G,而且内存占用增长迅速。
如果每条记录按照2个模板出力(模板中包含较小图片),则出力50条左右纪录时内存占用达到1.6G,内存占用基本稳定在1.6G左右。

请问是否有改善的办法,谢谢:)

相关代码:见附件

8 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-10-12 11:18:00
沙发
你好,

我们有专门针对ActiveReports 6.0日文版的技术支持论坛,你可以通过访问以下地址得到更多的支持信息:http://www.grapecity.com/tools/support/

我只能从英文版的角度来给你提供一些建议:
1、在报表文件中大图片会占用较多内存,尽量将图片压缩后使用
2、不合理的使用子报表会占用较多内存,子报表应该在ReportStart事件中来进行New操作,而不是在DetailFormat事件中进行New操作
3、在代码中声明的临时变量例如Jishikeikakusyo61ActiveReport,DataTable没有及时的释放资源,可以调用相应的Dispose方法来释放资源
4、可以使用Document.Pages.AddRange方法来代替循环调用Document.Pages.Add
回复 使用道具 举报
sunyuanze
注册会员   /  发表于:2011-10-12 11:24:00
板凳
多谢回答。

补充说明:

我们现在的做法是,把多个模板的pages都合并到一个document里:

For i As Integer = 0 To rep1.Document.Pages.Count - 1
     finalRep.Document.Pages.Add(rep1.Document.Pages(i))
Next
For i As Integer = 0 To rep2.Document.Pages.Count - 1
      finalRep.Document.Pages.Add(rep2.Document.Pages(i))
Next

就是内存中的这个finalRep.Document对象占用内存非常大,达到1G多,
而最后实际出力的pdf文件却并不大,只有几兆。

请问对于把多个模板的数据和并到一个document里,是否有改善的方法,谢谢:)
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-10-12 11:30:00
地板
多个模板合并到一个Document就是调用Pages.Add或者Pages.AddRange方法

你可以将程序拆分以下,先不进行合并操作,单独查看Jishikeikakusyo61ActiveReport、Jishikeikakusyo62ActiveReport和JishikeikakusyoBeshi61ActiveReport、JishikeikakusyoBeshi62ActiveReport报表的pages各自占用多少内存
回复 使用道具 举报
sunyuanze
注册会员   /  发表于:2011-10-12 13:54:00
5#
多谢回答,我试一下:)
回复 使用道具 举报
sunyuanze
注册会员   /  发表于:2011-10-12 14:31:00
6#
按照您的建议,我修改了代码:
                        Dim rep1 As New Jishikeikakusyo61ActiveReport
                        rep1.DataSource = LvTempDt
                        rep1.Run(False)
                        If finalRep.Document.Pages.Count > 0 Then
                            'For i As Integer = 0 To rep1.Document.Pages.Count - 1
                            '    finalRep.Document.Pages.Add(rep1.Document.Pages(i))
                            'Next
                            finalRep.Document.Pages.AddRange(rep1.Document.Pages)
                        Else
                            'For i As Integer = 0 To rep1.Document.Pages.Count - 1
                            '    finalRep2.Document.Pages.Add(rep1.Document.Pages(i))
                            'Next
                            finalRep2.Document.Pages.AddRange(rep1.Document.Pages)
                        End If
                        rep1.Dispose()
但是并没有多少改善。
运行时察看了一下内存,每次rep1.Run的时候,内存占用会增加2M左右,
而每次finalRep.Document.Pages.AddRange会增加几十兆的内存占用。
因为finalRep是要等到最后出力完pdf后才能释放的,所以数据量很多的场合,
finalRep的内存占用量会一直增大,而且增长很快。
是activereport对象占用内存就这么大么?
请问,是否还有其他好的改善建议,谢谢:)
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-10-12 15:37:00
7#

回复 6# sunyuanze 的帖子

你好,我需要在英文版中测试一下,然后给你回复。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-10-13 17:47:00
8#

回复 6# sunyuanze 的帖子

你好,

通过于产品部的沟通,AR的却存在这样的问题,并就该问题报了一个问题调查。

现在只能通过压缩图片的大小来回避该问题。
回复 使用道具 举报
sunyuanze
注册会员   /  发表于:2011-10-14 09:18:00
9#

回复 7# dof 的帖子

十分感谢您的回答:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部