急!急!急!TClientDataSet的SaveToFile导致内存溢出?(300分)

  • 主题发起人 主题发起人 sfh8106
  • 开始时间 开始时间
S

sfh8106

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]
本人在参与开发一个C/S系统的时候需要在一个模块中将数据库中的一些数据导出并保存
本地数据文件。数据库为Interbase类型,读取数据库中记录使用TIBQuery控件,然后连接
到TClientDataSet控件,通过ClientDataSet的SaveToFile方法将数据保存到本地。在开发
中遇到如下问题。
1、IBQuery 的UniDirectionary属性设为False,ClientDataSet的PackRecords属性设为-1
时导出记录并保存到数据文件时发生内存溢出错误,记录大约为10万条已内,
2、IBQuery 的UniDirectionary属性设为True,ClientDataSet的PackRecords属性设为1
时导出记录并保存到数据文件功能实现但耗时很长,记录大约为10万条已内;
3、IBQuery 的UniDirectionary属性设为True,ClientDataSet的PackRecords属性设为-1,1,
100,100(3种均试过)时导出记录并保存到数据文件时发生内存溢出错误(经过数个小时
才报错),记录大约为16万条。
请问各位大侠,如何解决此内存溢出的问题,并能够尽量时导出、保存数据的操作速度快些
呢?
 
你的试验环境太难搭建了。
我用Sqlserver2000+AdoExpress进行了简单测试
100000条记录,4个字段,类型全是简单类型。
用AdoTable取出所有记录,大约8秒钟。
使用AdoTable。savetofile成xml文件,大约15秒。文件大小大约10M。
可以直接loadfromfile,没有错误。
不知你C/S结构程序为什么要使用ClientDataSet?
 
这下没搞头了!
帮你测试了ClientDataSet,的确有问题。
当数据量太大时,程序死掉!(win2k也死了2回)
设置packetRecords为-1时,会死掉。
当数据量在30000以内时,不出现异常,但速度较慢,大约2分钟。
设置50000以上,死机。
怀疑CPU处理不该来了。
>>如何解决此内存溢出的问题
没发现有内存溢出错误,因为程序执行过程中,内存占有量变化不大,
而CPU使用率一直保持在100%,持续3分钟左右后死机。怀疑CPU处理不该来了。
从表象来看给ClientDataSet传递数据时应该是Cpu狂计算。
建议:
1。使用Ado组件,从server取数据快,保存数据快,Load数据快。(见上帖)
Ib组件没有提供save和Load方法,(faint!不然你就没那么多麻烦了)
2。PackRecords设为10000或5000(随便啦,别太大也别太小),然后GetNextPacket。
不过每次都要等2分钟左右!
如果你解决了问题,别忘告诉我一声 :-)
 
多谢GanQuan的帮忙:)
我用ClientDataSet是因为数据要层层上报,通过这种方式来上报数据。因为用的是
Interbase数据库所以自然不好用ADO的控件了,开始没有想到数据量大时会有这样的问题,
如果要修改方案,改变数据的保存方式,你觉的应该怎样做才好?请不吝赐教。
 
to :sfh8106
你好!最后是如何解决这个问题的?
 
to :sfh8106
目前只有先把包设置为5000,再写一个循环GetNextPacket.
 
后退
顶部