2014年10月16日

TClientDataSetとTFDMemTable


画面での編集用や、印刷時の、一時テーブルに、TClietnDataSetを使っていた。
FireDACには、同様の用途として、TFDMemTable があり、FireDACに置き換えたプロジェクトには、こちらを使っている。
で、パフォーマンスは違うのかどうなのだろうと気になり確認しました。


DelphiXE7で、テストプログラムは作成しています。
フィールドは、TLargeintFieldを1項目と、TIntegerFieldを10項目で作成しています。
TClietnDataSetについては、LogChanges=Falseに設定している。

Win32 データ100万件 (仮想マシン上で実行。メモリ3G割当設定)
 TFDMemTableTClientDataSet
Append
 7.300 Sec
6.630 Sec
 5.117 Sec
5.148 Sec
Close
 0.171 Sec
0.188 Sec
2.356 Sec
1.575 Sec

Win64 データ1000万件
 TFDMemTableTClientDataSet
Append
 54.618 Sec
54.825 Sec
 45.277 Sec
45.126 Sec
Close
1.555 Sec
1.655 Sec
 92.922 Sec
92.635 Sec

それぞれ2度づつ計測している。
Append処理は、若干、TClietnDataSetのほうが早いようだ。
ちょっと気になるというのかわからないのは、Closeで、TClietnDataSetが時間がかかる件。
タスクマネージャで見ていると、TFDMemTablは、Closeで一気にメモリ使用量が減るが、 TClietnDataSetは、Close後もしばらく増加傾向が続きその後、減少しているようだ。
TFDMemTableはs、Win32で、1000万件も処理できたが、TClietnDataSetでは、追加は動いたが、Close時に
---------------------------
Insufficient memory for this operation.
---------------------------
のエラーが出てしまう。(なので、上記テストは、Win32は、100万件としている)

全件追加した状態のタスクマネージャの観察してみると、TClietnDataSetのほうが、メモリの使用量が少ないようだ。メモリ管理を効率化してしまったがために、CLose時、何か問題を引き起こすようなことになっているのだろうか。Win64では、とりあえず、今回のテストでは同様の問題は起きない。

TFDMemTableのAppend、Closeのメモリの動き(わかりやすい)
増加のところは、Appendです。Appendが終わると増加はとまる。
Closeで一気に使用分が減る。


TClientDataSet 赤マーク部分でAppend終了、すぐにClose
なぜかCloseしても、使用メモリは増える。
緑でClose終了。黄色は、プログラム終了。
Closeでメモリ量が元に戻らないので、注意が必要ということか。。。。。


・・・・・・・・

ClientDataSetのClose時のエラー
---------------------------
Insufficient memory for this operation.
---------------------------
は、2015/1/15に、QP登録ずみ



以前、ClientDatasetを多数使用したプログラムで原因不明のメモリ例外でエラーとなることがあった。
日次で再起動するよう(それまでは、24時間365日起動)にしたら問題が起きなくなったので、この不具合が関係あるのかも。


posted by しんくそふと at 17:59| Comment(0) | TrackBack(0) | 開発TIPS
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/104652936
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック