■20106 / inTopicNo.7) |
Re[5]: DataGirdViewでメモリが解放されない |
□投稿者/ 魔界の仮面弁士 (761回)-(2008/06/05(Thu) 19:42:47)
|
2008/06/05(Thu) 19:45:32 編集(投稿者)
■No20102 (ぐっちょん さん) に返信 >> DataGridViewRow のインスタンスから、Cells コレクションを取得し、 >> その中の i 番目のセルを取得する…という処理を繰り返しているようですが、 > ただ、DataTableで取得するわけにもいかなくて、
DataReader で得たデータを DataTable に格納して使ってはいけないのでしょうか? 今のままだと、DataGridView 内には件数分の行インスタンスが生成されることになりますが、 データバインドを使えば、DataGridView では行のインスタンスを共有させる事ができるため、 メモリ効率が良くなるように思えます。
それと、私が先に書いたのは、データバインドの事を指しているわけではなく、 プロパティの参照回数を減らした方が良いのでは無いか、という意図のものでした。
たとえば、 DataGridView1.Rows(0).Cells(0).Value = data とするかわりに、 DataGridView1(0, 0).Value = data とすると、プロパティの参照回数を抑える事ができるかと思います。
前者だと、DataGridView → DataGridViewRowCollection → DataGridViewRow → DataGridViewCellCollection → DataGridViewCell → Object という順序で 参照されていきますが、後者の書き方にすれば、それぞれのプロパティ参照は DataGridView → DataGridViewCell → Object という手順で済むので、 コレクションを毎回取得する手間がわずかながらも省略できるかな、と。
あるいは、Rows や Cells などの参照を、ループ内で毎回繰り返させるのではなく、 それらを変数にキャッシュしておいて Dim cells As DataGridViewCellCollection cells = DataGridView1.Rows(row).Cells For i As Integer = 0 To dr.FieldCount - 1 cells(i).Value = dr(i) Next という書き方にする手法もあるかと思います。 (いずれにしても、データバインドにした方が効率は良いと思いますけれども)
> 軽い方法で実装するとDataReaderになってしまうのです。 (ASP.NET などのように)シーケンシャルなアクセスで良い場合には都合が良さそうですが、 今回のように、対象データすべてを表示させなければならないような状況においては、 むしろ効率が悪いかも知れません。セルを For で列挙するコストも馬鹿にならないので。
DataReader から 個別のセルに割り当てる今の方法と、(DataAdapter 等から) DataTable に取り込んだものをバインドさせる方法とで、それぞれの 処理速度およびメモリ効率について、比較実験してみてはいかがでしょう。
> アプリを実行している間に、メモリ使用量が蓄積されていきます。 http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1944927&SiteID=7
|
|