|
|
导航: |
论坛 -> 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;
----------------------------------------------
-
|
作者: |
|
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...无语.
----------------------------------------------
-
|
作者: |
|
2016/7/26 9:23:42 |
4楼: |
一般来说,这种内存占用,要考虑一下代码部分是不是有问题了
----------------------------------------------
-
|
作者: |
|
2016/7/26 10:44:10 |
5楼: |
1.3G程序早挂了
----------------------------------------------
-只会复制粘贴!
|
作者: |
|
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......
----------------------------------------------
-
|
作者: |
|
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 (sspeak) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2016/7/29 21:51:06 |
12楼: |
我的目的是想找个dataset的实现,能实现以下功能: 1.本地数据库,sqlite. 2.多个dataset指向同一份数据,任何时候都能保持数据一致,同时拥有独立的current record,index,filter. 3.性能不能减弱太多. 原来是看中了ClientDataset,现在看来有问题. 现在改用TFDMemTable.CloneCursor了,效果比较理想.小,快. CloneCursor真是非常强大!本来我都想自己实现个虚拟的dataset了,幸好看到这个.
----------------------------------------------
-
|
作者: |
|
2016/8/3 16:37:17 |
13楼: |
好贴 顶。。。
----------------------------------------------
kittyapp
|
作者: |
|
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) 呀!
----------------------------------------------
-
|
作者: |
|
2016/9/7 20:23:32 |
17楼: |
服务端用UniDAC直连Oracle, SQL出来的数据以 DataSetProvider.Data 值压缩后传到客户端(传输量相对较小,效率高),再由客户端导入ClientDataset。实测,数据量比较大时,ClientDataset内存占用确实很大。(程序以查询数据为主)
若不用CDS,想采用这种模式传输数据,有啥好方法?
----------------------------------------------
-
|
作者: |
|
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.
----------------------------------------------
-
|
作者: |
|
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楼武大神的建议是一解决办法。
----------------------------------------------
-
|
|