- PR -

VB.NETでのDBデータ保持処理について

投稿者投稿内容
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2006-11-20 14:49
現在、Accessデータベースmdbから値を取得し、画面に表示するというアプリを作成しています。
DBから取得した値を保持する形として、DBテーブルクラスを作成し、
作成したテーブルクラスのプロパティに値をセットしていくという方法をとっているのですが、
メモリ消費などが高く、処理が遅いように感じられます。
DBクラスを作って値を保持するやり方はよくないのでしょうか。
具体的には、member.getEntrynumber()みたいな形でデータを取得しています。
現在、スペックはそれなりのPCでリレーションの深さは3つほどで、データ件数10件前後での動作で、3秒弱かかっています。
パフォーマンス的によい方法がありましたら、教えていただけないでしょうか。
以上よろしくお願いします。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-11-20 15:16
引用:

uniqqueさんの書き込み (2006-11-20 14:49) より:
DBクラスを作って値を保持するやり方はよくないのでしょうか。


別にそんなことはないと思いますが...

引用:

uniqqueさんの書き込み (2006-11-20 14:49) より:
具体的には、member.getEntrynumber()みたいな形でデータを取得しています。


いまいちよく理解できませんでした。

引用:

現在、スペックはそれなりのPCで


実際のスペックを教えてください。

引用:

リレーションの深さは3つほどで、データ件数10件前後での動作で、3秒弱かかっています。


私はVB.NET 2005においてOleDbDataReaderを使用してmdbファイルからデータを取得するプログラムを書いたことがありますが、パフォーマンス的に問題になったことはありませんでした。
_________________
--------------------------------------------
HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています
HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2006-11-20 15:24
HIROさん
すいません。詳細なスペックを書き忘れていました。
Pentium4 3.2Gのメモリは1.5Gです。
私が作成したDBクラスというのは、
Memberというテーブルがあり、Memberテーブルのカラムにentrynumberがある場合に、
Memberクラスを作成し、entrynumberカラムのゲッターセッターを追加したものです。
DBアクセスせずに描画だけだと早いので、DBアクセスが原因だと思いました。
DBからDBクラスへの格納方法は、oledbAdapterのselectcommandで
SQLクエリーを実行し、取得したテーブルをDBクラスにセットしています。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-11-20 15:35
確認です。

Memberクラスをインスタンス化するのは、Memberテーブルが"entrynumber"という名前のフィールド(カラム)を持っている場合ということでしょうか?

もしそうだとして、Memberテーブルが"entrynumber"という名前のフィールド(カラム)を持っているかを確認し、インスタンス化するまでの時間が掛かっているだけということはありませんか?

どこの処理で時間が掛かっているかをTimer関数などを使用して計測してみてはどうですか?
_________________
--------------------------------------------
HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています
HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2006-11-20 15:51
HIROさん
>Memberクラスをインスタンス化するのは、Memberテーブルが"entrynumber"という名前のフ>ィールド(カラム)を持っている場合ということでしょうか?
その通りです。

カラム名ですが、
Collectionにカラム名をキー、カラムデータをオブジェクトとして確保しておき、
Memberテーブルをインスタンス化する際に、各DBクラスにコンストラクタのようなものを作り、
作成したコレクションをコンストラクタに渡し、各DBクラスで予め定義しておいたカラム名で
それぞれのフィールドを取得して設定するという処理を行っています。

もう少し登録データ数を増やしてタイマーで計測してみようと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-20 16:21
引用:

uniqqueさんの書き込み (2006-11-20 14:49) より:

メモリ消費などが高く、処理が遅いように感じられます。


メモリについては、どのように計測したのでしょうか?
たとえば、タスク マネージャの値はあてにならなかったりしますけど。

引用:

現在、Accessデータベースmdbから値を取得し、画面に表示するというアプリを作成しています。
(snip)
DBクラスを作って値を保持するやり方はよくないのでしょうか。
(snip)
パフォーマンス的によい方法がありましたら、教えていただけないでしょうか。


もっとも大きなファクタである、'実際の抽出件数' と 'データ量' についての情報がないですね。
数万件もの結果を返しているのであれば、ロジックどうこうの問題ではないですよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
uniqque
常連さん
会議室デビュー日: 2005/03/18
投稿数: 43
投稿日時: 2006-11-22 11:09
じゃんぬねっとさん
メモリはタスクマネージャで計測しました。
CPU使用率は全然高くないのに処理が遅いです。

実際の抽出件数は10件です。
データ量というのはDBの総件数のことですか?
総件数は30件です。
コーディングは、データの件数分のDBクラスを用意し、
紐づくテーブルがあればそのテーブルのクラスを作成し、
getToリレーション先のようにして取り出せるようにしてます。
DBからデータを取り出す処理は、リレーションの深さの分だけ
For分が深くなってます。
システムとしては数万件になることはないです。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-11-22 11:40
引用:

コーディングは、データの件数分のDBクラスを用意し、
紐づくテーブルがあればそのテーブルのクラスを作成し、
getToリレーション先のようにして取り出せるようにしてます。
DBからデータを取り出す処理は、リレーションの深さの分だけ
For分が深くなってます。


コードを見ていないので何ともいえないですが、For文が深くなっているというのが気になりますね。
抽出件数は10件とのことですが、デバッガでステップ実行してみましたか?
抽出件数が10件でもコーディングの仕方によってはFor文をすぐに抜けられないような作りになっていいたりしないか確認してみてはどうでしょう
_________________
--------------------------------------------
HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています
HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ

スキルアップ/キャリアアップ(JOB@IT)