当前位置:主页>仓库管理软件> 列表

如何提高ClientDataset的写入速度? 找仓库管理

仓库管理软件版1楼: 环境:数据库为Oracle9i,中间层为 Tuxedo,客户端Delphi7
测试如下:3万行记录,30个字段(每行约800字节),写入ClientDataset(内存,非文件)约13s
请问如何提高写入速度?

2楼: 你是如何写入的,贴上相应的代码。具体的解决方法应该有对sql的优化以及对循环过程的优化。 如进销存设计

3楼: for ...
begin
ClientDataSet1.Append;
ClientDataSet1.Fields[0].Value := ...
...
ClientDataSet1.Fields[N].Value := ...
ClientDataSet1.Post;
end;

4楼: 没有什么好办法,数据多了,怎么写都差不多.

5楼: 如果用 AppendRecord,如何动态的构造一个 const Values: array of const ?

(AppendRecord(const Values: array of const);)

6楼: 如果你采用单条写速度差不多了。可以采用存储过程同时写10条,这样速度立即快上来了。
你是与数据库进行数据交换3万次来回,如果采用上面方法,和数据库只交换3千次来回,知道么?

仓库管理软件版7楼: 和数据已经无关了
数据已经通过中间件取到了客户端,我只是将数据打包到 ClientDataSet 中

8楼: 这样吧(笨一点的方法),大家看行不行。


ClientDataSet有(AppendData)这个功能,
你开多个线程,多建几个ClientDataSet,把数要写入的数据从不同位置,分别同时向ClientDataSet追加。
然后再把数据追加到一起。

9楼: cds是内存里面的吧。最后一次applyupdate比较好。
Tuxedo好么?怎么用咧?

10楼: 可不可以考虑在中间层接收数据时,直接把数据处理成ClientDataSet可以接受的格式,然后一次性的从内存流中加载 即ClientDataSet.loadfromstream,估计这样比一笔笔的添加要快的多

另外,加载时关闭数据感知控件;像你上面的代码中,不要在最后额外加POST等(因为APPEND之前会POST)或许均可以节省点时间吧
Array of const的方法如下

var abc:string;
begin
abc:=''test'';
ClientDataSet1.AppendRecord([''a'',1,''bc'',abc]);
end;

顺序与字段顺序要一一对应

11楼: 建議用無態形式來做。從分利用存儲過程。

12楼: 采用块写入法,一秒搞定 如服装销售软件有哪些

13楼: to zj_mpy:
请说的详细一点

仓库管理软件版14楼: applyDB,最快了

15楼: 期待zj_mpy的块写入法,公报出来!

16楼: 神奇,1秒钟,飞天哟。
那可是3万条记录也,大哥!

17楼: 这么大数据,怎么写也快不了,还是改为存储过程吧

18楼: 哈哈,建议你看看: Berkeley DB

19楼: 感兴趣,顶一下!

20楼: 想办法用“insert”或用“update”

仓库管理软件版21楼: 利用XML,Clientdataset支持XML文件的,可以把ClientDataset中的数据保存到XMl文件中,然后提交到中间层处理.
现在正在研究中....

22楼: zsy146说得对,我就是这么做的,xml是中间层返回的数据集文件,然后一次导入clientdataset,感觉这样最快 如仓库管理

23楼: 中间层是用C写的,处理XML比较麻烦
再者说,如果中间层用XML的方式,中间层+本地处理的时间比以前更长了

24楼: 正好在搞这方面,

25楼: 用存储过程,或是自Insert语句并用使用参数和预编译.如果是短时间内插入大量数据,而且是短期行为的话,可以先把索引都删除了,再插再建索引.

26楼: 觉得怎么也快不了你总要从中间层到客户端吧!
不过你中间层是什么格式的。

27楼: 前面加上 ClientDataSet1.disablecontrol看看

仓库管理软件版28楼: cds毕竟是一种文件型的结构数据表,并且并不知道其格式,所以存放的数据不易过多.

29楼: with ClientDataset1 do


begin
DisableControl;
try

for ...
begin
ClientDataSet1.Append;
ClientDataSet1.Fields[0].Value := ...
...
ClientDataSet1.Fields[N].Value := ...
end;
ClientDataSet1.Post;//移到外面來

finally
EnableControl;
end;
end;

30楼: 3万行记录
如果格式统一
建议用BCP导入,大概一两秒吧
clientdataset是重量级控件,这里根本不就该选用它

31楼: 可能我前面描述的不是太清楚,抱歉!

系统采用三层架构
S:数据库 Oracle
S:中间层 Tuxedo + Linux (标准C)
C:采用ClientDataSet作为数据存储

客户端启动时下载一些必要的数据,其中有一张表约3万行数据(30个字段),中间处理的时间约为2s(Tuxedo特有的格式FML32),客户端写入CDS速度较慢(已设置DisableControl),如何提高客户端写入CDS的速度?

32楼: 采用 存储过程 和 事务管理

33楼: 中间层采用传数据包的形式传到客户端,
clientdataset.data := 传回的数据包;

34楼: 可以对数据包进行压缩传输.

仓库管理软件版35楼: 对数据进行分段提交,首先将数据存放到客户机的内存中,应该为100条左右对数据进行提交一次,具体情况经过测试在确定。


在对数据库进行提交前,将数据库中的索引信息进行删除,待数据全部提交后重建需要信息应该能够提高数据的写入速度。

36楼: 我也遇到过同样的问题。可以通过CloneCursor解决。请参见我的笔记:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=4566
最后两条。

37楼: 路过,听高手上课

38楼: 可以试一下AppendRecord

39楼: 可以尝试把表锁改成行锁,然后启用多线程模式

40楼: 你的意思是……
如果你想提高数据从中间层到客户端(cds)这个“下载”过程的速度,那么很难了!也许你可以考虑分段、逐步下载。
如果想提高客户端编辑数据(如果插入)的速度,建议:
再增加一个cds,这个cds和原来的那个结构一样,但不包含数据或只包含少量数据。用这个
cds编辑数据。
cds下载数据的时候,也会建立相应的索引,因此数据多的时候插入数据会很慢

41楼: to yeskert1:
再增加一个cds?什么意思?在哪一层增加?
中间层返回给客户端的是TUXEDO特定的格式FML32,客户端接收应用服务器返回的FML32数据包后写入cds。现在的问题是写入cds的速度太慢!

仓库管理软件版42楼: 各位帮我看一下
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3525219

43楼: 自己些个控件

44楼: to zhaokaien:


我要的是解决写入cds速度慢的方法,和写控件没有关系吧?

45楼: 看来都是高手过招啊,一点也看不懂,路过Up一下

46楼: 我理解一下楼主的意思:是不是客户端只是将ClientDataSet作为数据容器,读入从中间件读取的数据,然后显示,没有更新的问题。
如果是这样的话,我建议使用一下下面的优化方法:

LogChanges := False;
保证不记录每次变化(如果每次赋值都会触发)

当然,原来的DisableControls也要用上。

47楼: 可以试一下用 sqlite 作为数据容器,采用内存方式,3万条应该会小于 5 秒

48楼: ClientDataset如何过滤单个汉字
如:FieldName LIKE ''%中%''

仓库管理软件版49楼: 我要聽書了~
請高手講解~

50楼: 多人接受答案了。