起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 349|回复: 7

自定义数据集循环加载数据大量吃内存,有代码

[复制链接]
发表于 2010-6-10 09:57:32 | 显示全部楼层 |阅读模式
相关代码如下:     
     strSqlDetail:='Select a.GBJGZH,a.FORMULA,a.XSSXLX,a.XSHWXL,a.XSMDQY,a.TRANS_TYPE,a.ORIG_STN,a.PRICE_AREA,'+
     'a.INSU_RATE,a.ZDBXF,a.TIMELIMIT_TYPE,a.FREIGHT_TYPE_MIN,a.INURE_DATE,a.ENDING_DATE,'+
     'b.ZLFWH,b.SJ,b.XZ,b.XZJG,b.SZ,b.ZLXX,b.ZLSX,wmsys.wm_concat(DEST_STN) As DEST_STN '+
     'From cae.TB_SAL_PUBLICPRICE1 a Inner Join cae.GSJGTB b On a.TH=b.TH '+
     'Where jgxl_id='''+dsbXL.DataSet.FieldByName('JGXL_ID').AsString.Trim+''' '+
     'Group By a.GBJGZH,a.FORMULA,a.XSSXLX,a.XSHWXL,a.XSMDQY,a.TRANS_TYPE,a.ORIG_STN,a.PRICE_AREA,a.INSU_RATE,'+
     'a.ZDBXF,a.TIMELIMIT_TYPE,a.FREIGHT_TYPE_MIN,a.INURE_DATE,a.ENDING_DATE,b.ZLFWH,b.SJ,b.XZ,b.XZJG,b.SZ,b.ZLXX,b.ZLSX';

     qPrices:=TQuery.Create(Self);
     qPrices.ConnectionString:='DATABASEURL=Biz:\JUSTEPCOOPERATIONSYSTEM\COOPERATIONDB.DATABASE';
     qPrices.CommandText:=strSqlDetail;
     qPrices.Open;

     i:=0;
     while not qPrices.Eof do
     begin
          i:=i+1;
          progress(i,qPrices.RecordCount);
          dsbPrices.DataSet.Append;
          dsbPrices.DataSet.FieldByName('GS').AsString:=qPrices.FieldByName('FORMULA').AsString.Trim;
          dsbPrices.DataSet.FieldByName('CPSX').AsString:=qPrices.FieldByName('XSSXLX').AsString.Trim;
          dsbPrices.DataSet.FieldByName('HWLX').AsString:=qPrices.FieldByName('XSHWXL').AsString.Trim;
          dsbPrices.DataSet.FieldByName('ZDQY').AsString:=qPrices.FieldByName('XSMDQY').AsString.Trim;
          dsbPrices.DataSet.FieldByName('YSFS').AsString:=qPrices.FieldByName('TRANS_TYPE').AsString.Trim;
          dsbPrices.DataSet.FieldByName('QDQY').AsString:=qPrices.FieldByName('ORIG_STN').AsString.Trim;
          dsbPrices.DataSet.FieldByName('JGLX').AsString:=qPrices.FieldByName('PRICE_AREA').AsString.Trim;
          dsbPrices.DataSet.FieldByName('BXFL').AsString:=qPrices.FieldByName('INSU_RATE').AsString.Trim;
          dsbPrices.DataSet.FieldByName('ZDBXF').AsString:=qPrices.FieldByName('ZDBXF').AsString.Trim;
          dsbPrices.DataSet.FieldByName('CPSXID').AsString:=qPrices.FieldByName('TIMELIMIT_TYPE').AsString.Trim;
          dsbPrices.DataSet.FieldByName('HWLXID').AsString:=qPrices.FieldByName('FREIGHT_TYPE_MIN').AsString.Trim;
          dsbPrices.DataSet.FieldByName('YXRQQS').AsString:=qPrices.FieldByName('INURE_DATE').AsString.Trim;
          dsbPrices.DataSet.FieldByName('YXRQZZ').AsString:=qPrices.FieldByName('ENDING_DATE').AsString.Trim;

          dsbPrices.DataSet.FieldByName('ZLFW').AsString:=qPrices.FieldByName('ZLFWH').AsString.Trim;
          dsbPrices.DataSet.FieldByName('ZDSF').AsString:=qPrices.FieldByName('SJ').AsString.Trim;
          dsbPrices.DataSet.FieldByName('XZ').AsString:=qPrices.FieldByName('XZ').AsString.Trim;
          dsbPrices.DataSet.FieldByName('XJ').AsString:=qPrices.FieldByName('XZJG').AsString.Trim;
          dsbPrices.DataSet.FieldByName('SZ').AsString:=qPrices.FieldByName('SZ').AsString.Trim;
          dsbPrices.DataSet.FieldByName('ZLXX').AsString:=qPrices.FieldByName('ZLXX').AsString.Trim;
          dsbPrices.DataSet.FieldByName('ZLSX').AsString:=qPrices.FieldByName('ZLSX').AsString.Trim;

          dsbPrices.DataSet.FieldByName('ZDQYID').AsString:=qPrices.FieldByName('DEST_STN').AsString.Trim+',';

          strZHC:=strZHC+qPrices.FieldByName('GBJGZH').AsString.Trim+',';

          qPrices.Next;
     end;
     JGZHC:=strZHC.Trim([',']).Trim.Split([',']);

     qPrices.Close;
     qPrices.Free;

版本号:3.0.6.3109
现象:strSqlDetail的查询结果比较多时(也就是循环次数比较多时),大约几千行,就出现内存溢出的报错,后经任务管理器监测,在循环过程中,内存使用量迅速增加,循环加载过程结束后内存会恢复到正常水平,但遇到几千次的循环,我2G内存都撑不住,更别说基层业务人员的电脑了。
说明:dsbPrices是一个自定义数据集。progress(i,qPrices.RecordCount);是一个加载进度条的方法。
请问有没有更好的为自定义数据集赋值的方法吗?或如何解决内存大量使用的问题?
回复

使用道具 举报

发表于 2010-6-10 11:41:20 | 显示全部楼层
自定义数据集的数据都是存储在内存中,你从query中查询出来的数据是不是很大?有没有内容很大的字段?

如果数据量不大应该没有问题,我10个字段搞了2万多条数据也就使用10M左右的内存。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-10 12:07:34 | 显示全部楼层
内容多大的字段算大啊?我看了看最大的也就是50个字符的字段。查询出的数据量5404条,22个字段。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-10 12:18:08 | 显示全部楼层

附上sql查询的结果集excel文件

附上sql查询的结果集excel文件

resault.rar

309.44 KB, 下载次数: 115

回复 支持 反对

使用道具 举报

发表于 2010-6-10 15:25:09 | 显示全部楼层
我把你给的5000多条数据全都导入到自定义数据集就用了几M内存

确定是执行这段代码的时候报的错误么?
把没用的代码行先删除,只留给自定义数据集字段赋值的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-10 15:59:35 | 显示全部楼层
对了,我的自定义数据集有些字段是有“查找属性定义”的,是不是这个太耗费资源了?如果是,该怎么解决?
回复 支持 反对

使用道具 举报

发表于 2010-6-10 16:19:55 | 显示全部楼层
查找属性如果查找数据量大会占用内存,但是应该与循环次数无关了。
建议楼主用排除法试试:
逐个去掉值得怀疑的对象,看看究竟是什么设置导致了内存占用过大,如:可疑的代码,数据集事件或者属性定义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-10 16:29:27 | 显示全部楼层
那基本可以肯定是查找属性定义的问题了,谢谢你们
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 23:02 , Processed in 0.052850 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表