DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 10
在线用户: 12
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/25 12:38:46
标题:
ClientDataSet,内存占用怎么这么大? 浏览:3023
加入我的收藏
楼主: 做了个测试程序,很简单.无数据UI.只有一个打开数据库操作.
SQLite,8000条记录,每条200字节左右.
1.只用FireDAC,FDConnection+FDTable,时,内存:10M.
2.增加 DataSetProvider+ClientDataSet,(use midaslib,),时,内存狂增到1.3G.
令人难以置信!
有谁知道这是怎么回事吗?
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/25 15:08:34
1楼: 补充:
FDTable1.Active := True;
DataSetProvider1.DataSet:=FDTable1;
ClientDataSet1.ProviderName:=DataSetProvider1;
ClientDataSet1.Active:=true;
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2016/7/25 21:18:25
2楼: 这个不大可能,我也是D10+ClientDataset,程序全打开也是67M左右,上G不对吧。
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/25 21:57:42
3楼: 是啊,应该是不可能的...不知为什么.
现在换TFDMemTable了,内存.........13M...无语.
----------------------------------------------
-
作者:
男 sonicer (sonicer) ★☆☆☆☆ -
盒子活跃会员
2016/7/26 9:23:42
4楼: 一般来说,这种内存占用,要考虑一下代码部分是不是有问题了
----------------------------------------------
-
作者:
男 wanlgrm (么么) ▲▲▲▲▲ -
普通会员
2016/7/26 10:44:10
5楼: 1.3G程序早挂了
----------------------------------------------
-只会复制粘贴!
作者:
男 4110349 (自由飞翔) ★☆☆☆☆ -
盒子活跃会员
2016/7/26 12:36:40
6楼: 取得数据多,内存占用多正常的;
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/26 12:58:57
7楼: 刚才又试了一下,逐步添加数据,内存基本线性增长.4000条=500M.
不知你们一般是多少数据,有没有碰到这种问题.
代码应该不会有问题的,都是非常简单的.
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/26 13:12:51
8楼: 晕....
再试,按钮,执行:
  ClientDataSet1.Close;
  FDTable1.Open;
  FDTable1.DisableControls;
  FDConnection1.StartTransaction;
  FDTable1.添加一条记录; 
  FDConnection1.Commit;
  FDTable1.EnableControls;
  ClientDataSet1.Open;
每按一次都会使内存占用发生很大变化,从40M-1.2G......
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2016/7/26 13:46:22
9楼: ClientDataSet本来就不是给处理大数据用的.而是为了在本地缓存,傻瓜化处理.
真要是非常大量的数据,用很多其他处理办法.
也可以自己继承Dataset写一个.而不使用ClientDataSet这种很多数据冗余的形式.

极限关注内存和CPU使用率的话就不能使用Dataset了,而是自己实现数据结构.

但是也不能无限加载数据,特别大的时候要有一些类似分页之类的机制
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2016/7/27 15:47:16
10楼: ClientDataSet是很成熟的,你应该是程序的问题,我都用了那么多年了,也没有遇到你说的情况。还有,你检查检查你的数据,是否有特殊字符数据,或者字段名用了中文或者系统关键字。
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/29 21:42:26
11楼: 真的是非常简单的,没这些问题,我发下源码,有空的可以试试.
此帖子包含附件:sspeak_2016729214226.rar 大小:59.8K
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2016/7/29 21:51:06
12楼: 我的目的是想找个dataset的实现,能实现以下功能:
1.本地数据库,sqlite.
2.多个dataset指向同一份数据,任何时候都能保持数据一致,同时拥有独立的current record,index,filter.
3.性能不能减弱太多.
原来是看中了ClientDataset,现在看来有问题.
现在改用TFDMemTable.CloneCursor了,效果比较理想.小,快.
CloneCursor真是非常强大!本来我都想自己实现个虚拟的dataset了,幸好看到这个.
----------------------------------------------
-
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2016/8/3 16:37:17
13楼: 好贴 顶。。。
----------------------------------------------
kittyapp
作者:
男 tintin1943 (零输好) ★☆☆☆☆ -
盒子活跃会员
2016/8/5 2:36:15
14楼: 楼主可能不知道 ClientDataset(CDS)是在D3时代引入,那是一个 COM/DCOM流行的时代,Olevariant贯穿 CDS的结构体加载和保存。。Olevariant号称万能变量,虽然强大,但是又慢又耗费你内存。

一句话,放弃CDS正是时候,尤其是在移动平台上,坚决丢掉CDS。
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2016/8/5 16:48:09
15楼: 楼上的,你的博客怎么关闭了啊,以前经常看看你的博客有啥新内容。
Cds不用用什么好啊?这么多年都习惯了。有介绍文章么?
----------------------------------------------
-
作者:
男 vga (vga) ★☆☆☆☆ -
盒子活跃会员
2016/8/19 6:58:27
16楼: mORMot 也用 ClientDataset(CDS) 呀!
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2016/9/7 20:23:32
17楼: 服务端用UniDAC直连Oracle, SQL出来的数据以 DataSetProvider.Data 值压缩后传到客户端(传输量相对较小,效率高),再由客户端导入ClientDataset。实测,数据量比较大时,ClientDataset内存占用确实很大。(程序以查询数据为主)

若不用CDS,想采用这种模式传输数据,有啥好方法?
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2016/9/8 14:57:12
18楼: cds:=TClientDataSet.create(nil);
cds.data:=tmpData;

其中tmpData:=DataSetProvider.data;

实际运行时当tmpData尺寸较大时,
cds.data:=tmpData 会出错:Out of memory. insufficent memory of this operation.

还有其他啥组件替代TClientDataSet,支持直接赋值DataSetProvider.data的?

Delphi版本为XE3.
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2016/9/8 21:46:53
19楼: 续18楼:
测试时(VCL框架+UniDAC),tmpData大小为6532328字节(6.05M,133147条记录,别说分页存取啊啥的,这是测试,实际软件中也遇到有这需求),运行下句:
cds.data:=tmpData;
内存耗用增加533972K字节(521.457M),可见TClientDataSet相当耗费内存。

在Windows server 2003 + Delphi XE3 调试模式下运行会出错:Out of memory.

换个环境,在Windows 7 + Delphi XE7下,同样的程序,调试模式下运行不出错。

XE3的TClientDataSet有BUG?

TClientDataSet太费内存,以后的软件中要注意这个问题,有大数据量需求时慎用。9楼武大神的建议是一解决办法。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行74.21875毫秒 RSS