我一直在使用delphi自带的ClientSet,但是速度确实不敢恭维,在数据量大的时候,速度下降得非常快。所以想找一个替代品,但是不知道哪个第三方的内存表速度比较快?最重要的是载入数据时的速度!

解决方案 »

  1.   

    这个控件不错,测试的结果是比ClientSet快一倍。
    我的测试数据是一个40多个字段4W条数据的表
    ClientSet打开是25秒,KBMMemTable打开是12.5秒。不知道还有没有更快一些的呢?因为使用ADO打开还不用3秒。
      

  2.   

    应该可以通过KBMMemTable的部分属性或者相关,特别是内存分配等参数可以进一步提高(具体的不清楚,没有用过^_^).
      

  3.   

    ADO打开数据里,是没有把数据全部加载到DataSet中的。
    内存表控件肯定是要把数据全部加载的。
    KbmMemTable.LoadFromFile 4w条数据要12.5秒吗?
    应该要不了吧?
      

  4.   

    呵呵,正在努力中...
    现在需求解决这个性能问题,很多客户都投诉速度慢,症结就出在这个ClientDataset身上。我也努力让客户不要一次查询这么多的数据出来,但是有些客户就喜欢这么做,唉!
      

  5.   

    也给你推荐一个吧,DevExpress组件里有一个dxMemData1: TdxMemData组件,不知道效率如何,你也测一下devExpress组件在www.2ccc.com里能找到
      

  6.   


    把文件数据加载到TMemoryStream.再让KBMMemTable从MemoryStream中LoadFromStream试试
      

  7.   

    dxMemData这个控件的测试结果是,速度比ClientDataSet还要慢
      

  8.   


    之前我是使用KBMMemTable的LoadFromDataSet从adoquery中加载数据,但是adoquery没有提供将数据保持到memorystream的方法
      

  9.   

    之前我是使用KBMMemTable的LoadFromDataSet从adoquery中加载数据
    那你测试的时间是不是就是从adoquery-->LoadFormDataSet的时间哦?
    如果是那样速度就不会快了,因为要不停的到adoQuery中取数据了,往KBMMemTable中写数据应该很快,读adoQuery数据就比较慢了.可以试就改变
    ADOQuery的CacheSize(>500)和游标类型(一般ReadOnly的比较快)
    另外在Copy数据时,再映射字段时,不要用FieldByName('字段名')的方式,要用Fields[下标索引]
      

  10.   

    根据blazingfire的提示,修改了一些adoquery属性的修改,发现一个非常奇怪的现象,不过性能问题得到了完美的解决!
    修改的方法如下:CursorLocation->clUseServer,CursorType->ctOpenForwardOnly,LockType->ltReadOnly。
    这三个属性必须设置成这样,设置成这样后,加载数据的时间立即缩短为6.8秒,这三个属性只要有一个不是这样,加载数据的时间就变成25秒。
    上面提到的时间是从adoquery.open到完全加载到clientdataset并且显示数据到dbgrid
    属性经过这样修改后,直接使用clientdataset的性能是最好的,比使用KBMMemTable的速度还要快。
    使用KBMMemTable的时间是7秒多,而且这个时间还没计算显示到界面的。
      

  11.   

    对Access操作,更是这样,ADO的相应设置。速度可能相差10~100倍以上!!
      

  12.   

    正在准备数据,等一下就要对access数据库做测试!
      

  13.   

    Access数据库的测试结果:
    8.5秒和25秒
    只要设置好这三个属性,性能就可以达到可接受的范围了。