找回密码
 立即注册

QQ登录

只需一步,快速开始

ghostlyt

初级会员

18

主题

76

帖子

214

积分

初级会员

积分
214

活字格认证微信认证勋章

ghostlyt
初级会员   /  发表于:2016-5-16 14:36  /   查看:8015  /  回复:15
现状:
使用C1FlexGrid处理较大的数据量(大概150列,10000行左右)
由于要分条件单独控制每个单元格的颜色,
导致内部创建大量的CellStyle,从而占用了大量的内存,导致程序内存溢出。
做sample简单测试了一下,一百万个单元格指定了BackColor和ForeColor后,大约要占1G的内存

有没有什么办法避免这个问题?

15 个回复

倒序浏览
unity
社区贡献组   /  发表于:2016-5-18 08:37:18
推荐
不应该为每个单元格单独设置style。
可以先把可能用到的style添加到 flexgrid的Styles中,
这样可以让一些单元格公用style对象。

评分

参与人数 1金币 +999 收起 理由
Alice + 999 很给力!

查看全部评分

回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-5-16 18:44:05
沙发
从你的描述来看,你的性能影响是在列上(150列)
在WinForm平台下,对于grid类产品,列的增加对性能会有很严重的影响。

你提到的内存占用较大,之前我们没有遇到,建议您给个Demo,我们先测试下。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2016-5-17 08:48:49
板凳
Dim sty As CellStyle
With Me.C1FlexGrid1
    .Cols.Count = 100
    .Rows.Count = 10000
    For r As Integer = 1 To 9999
        For c As Integer = 1 To 99
            sty = .GetCellRange(r, c).StyleNew
            sty.ForeColor = Color.Black
            sty.BackColor = Color.LightCyan
        Next
    Next
End With
测试代码如上,就是对每个单元格调用StyleNew属性,然后对取得的该Style设置颜色。
原因应该是每单元格都产生一个CellStyle对象,导致内存占用过量

回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2016-5-17 10:05:50
地板
我进行了一下内存分析,发现是每个CellStyle都创建了两个SolidBrush对象,分别对应着ForeColor和BackColor,就是这个东西导致内存大量占用的。
用sample测试单独创建2M个SolidBrush对象,内存占用与上面程序大体相同。
恐怕这个问题没有简单办法能解决,除非让各个CellStyle能共享少数个SolidBrush对象
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-5-17 15:32:17
5#
ghostlyt 发表于 2016-5-17 10:05
我进行了一下内存分析,发现是每个CellStyle都创建了两个SolidBrush对象,分别对应着ForeColor和BackColor ...

谢谢您的反馈。
是的,目前没有合适的提高方法。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2016-5-18 09:15:23
7#
unity 发表于 2016-5-18 08:37
不应该为每个单元格单独设置style。
可以先把可能用到的style添加到 flexgrid的Styles中,
这样可以让一 ...

我现在是这么做的:
开辟一个缓存,
给某单元格设定颜色后,查看当前的Style有没有在缓存中,如果没有就将它加入缓存;
如果已经存在就把缓存里的Style设定到该单元格。

但是这个做法有比较严重的性能问题:没办法快速得到单元格设定颜色之后的Style,只能通过Style的Clone方法创建副本,但大量的Clone会带来很大的性能开销。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-5-18 18:48:56
8#
ghostlyt 发表于 2016-5-18 09:15
我现在是这么做的:
开辟一个缓存,
给某单元格设定颜色后,查看当前的Style有没有在缓存中,如果没有 ...

对于您提出的这个问题,我们目前没有什么好的建议。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
ghostlyt
初级会员   /  发表于:2016-5-19 13:51:14
9#
那我换种方式,
用OwnerDrawCell事件自定义重绘来改变各个单元格的颜色。
背景色可以通过e.Graphics.FillRectangle来绘制,
不知道文字颜色该怎么绘制?
回复 使用道具 举报
unity
社区贡献组   /  发表于:2016-5-19 17:24:55
10#
ghostlyt 发表于 2016-5-19 13:51
那我换种方式,
用OwnerDrawCell事件自定义重绘来改变各个单元格的颜色。
背景色可以通过e.Graphics.Fill ...

文字可以用
e.Graphics.DrawString

评分

参与人数 1金币 +999 收起 理由
Alice + 999 很给力!

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部