寻找一个快速的内存表! 我一直在使用delphi自带的ClientSet,但是速度确实不敢恭维,在数据量大的时候,速度下降得非常快。所以想找一个替代品,但是不知道哪个第三方的内存表速度比较快?最重要的是载入数据时的速度! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个控件不错,测试的结果是比ClientSet快一倍。我的测试数据是一个40多个字段4W条数据的表ClientSet打开是25秒,KBMMemTable打开是12.5秒。不知道还有没有更快一些的呢?因为使用ADO打开还不用3秒。 应该可以通过KBMMemTable的部分属性或者相关,特别是内存分配等参数可以进一步提高(具体的不清楚,没有用过^_^). ADO打开数据里,是没有把数据全部加载到DataSet中的。内存表控件肯定是要把数据全部加载的。KbmMemTable.LoadFromFile 4w条数据要12.5秒吗?应该要不了吧? 呵呵,正在努力中...现在需求解决这个性能问题,很多客户都投诉速度慢,症结就出在这个ClientDataset身上。我也努力让客户不要一次查询这么多的数据出来,但是有些客户就喜欢这么做,唉! 也给你推荐一个吧,DevExpress组件里有一个dxMemData1: TdxMemData组件,不知道效率如何,你也测一下devExpress组件在www.2ccc.com里能找到 把文件数据加载到TMemoryStream.再让KBMMemTable从MemoryStream中LoadFromStream试试 dxMemData这个控件的测试结果是,速度比ClientDataSet还要慢 之前我是使用KBMMemTable的LoadFromDataSet从adoquery中加载数据,但是adoquery没有提供将数据保持到memorystream的方法 之前我是使用KBMMemTable的LoadFromDataSet从adoquery中加载数据那你测试的时间是不是就是从adoquery-->LoadFormDataSet的时间哦?如果是那样速度就不会快了,因为要不停的到adoQuery中取数据了,往KBMMemTable中写数据应该很快,读adoQuery数据就比较慢了.可以试就改变ADOQuery的CacheSize(>500)和游标类型(一般ReadOnly的比较快)另外在Copy数据时,再映射字段时,不要用FieldByName('字段名')的方式,要用Fields[下标索引] 根据blazingfire的提示,修改了一些adoquery属性的修改,发现一个非常奇怪的现象,不过性能问题得到了完美的解决!修改的方法如下:CursorLocation->clUseServer,CursorType->ctOpenForwardOnly,LockType->ltReadOnly。这三个属性必须设置成这样,设置成这样后,加载数据的时间立即缩短为6.8秒,这三个属性只要有一个不是这样,加载数据的时间就变成25秒。上面提到的时间是从adoquery.open到完全加载到clientdataset并且显示数据到dbgrid属性经过这样修改后,直接使用clientdataset的性能是最好的,比使用KBMMemTable的速度还要快。使用KBMMemTable的时间是7秒多,而且这个时间还没计算显示到界面的。 对Access操作,更是这样,ADO的相应设置。速度可能相差10~100倍以上!! 正在准备数据,等一下就要对access数据库做测试! Access数据库的测试结果:8.5秒和25秒只要设置好这三个属性,性能就可以达到可接受的范围了。 动态创建数据模块TDataModule Delphi 做的程序,怎么放到手机里面运行? 寻高手帮忙编译一个开源邮件客户端系统 VCL转OCX的问题? 关于用钩子截获 $1E2 这个消息?? 在VeryCD注册的兄弟,给个注册序列号吧,谢谢 哪里可以下载李维的电子书籍? WEB service 接口遇到问题,求帮忙!!! 很菜的问题 怎样在Edit控件中实现类似ComboBox的下拉效果?(初……) 打算转行搞家电维修 +++继续散分,继续找工作+++
我的测试数据是一个40多个字段4W条数据的表
ClientSet打开是25秒,KBMMemTable打开是12.5秒。不知道还有没有更快一些的呢?因为使用ADO打开还不用3秒。
内存表控件肯定是要把数据全部加载的。
KbmMemTable.LoadFromFile 4w条数据要12.5秒吗?
应该要不了吧?
现在需求解决这个性能问题,很多客户都投诉速度慢,症结就出在这个ClientDataset身上。我也努力让客户不要一次查询这么多的数据出来,但是有些客户就喜欢这么做,唉!
把文件数据加载到TMemoryStream.再让KBMMemTable从MemoryStream中LoadFromStream试试
之前我是使用KBMMemTable的LoadFromDataSet从adoquery中加载数据,但是adoquery没有提供将数据保持到memorystream的方法
那你测试的时间是不是就是从adoquery-->LoadFormDataSet的时间哦?
如果是那样速度就不会快了,因为要不停的到adoQuery中取数据了,往KBMMemTable中写数据应该很快,读adoQuery数据就比较慢了.可以试就改变
ADOQuery的CacheSize(>500)和游标类型(一般ReadOnly的比较快)
另外在Copy数据时,再映射字段时,不要用FieldByName('字段名')的方式,要用Fields[下标索引]
修改的方法如下:CursorLocation->clUseServer,CursorType->ctOpenForwardOnly,LockType->ltReadOnly。
这三个属性必须设置成这样,设置成这样后,加载数据的时间立即缩短为6.8秒,这三个属性只要有一个不是这样,加载数据的时间就变成25秒。
上面提到的时间是从adoquery.open到完全加载到clientdataset并且显示数据到dbgrid
属性经过这样修改后,直接使用clientdataset的性能是最好的,比使用KBMMemTable的速度还要快。
使用KBMMemTable的时间是7秒多,而且这个时间还没计算显示到界面的。
8.5秒和25秒
只要设置好这三个属性,性能就可以达到可接受的范围了。