C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: WindowFormのメモリ使用量増加について


(過去ログ 80 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■47354 / inTopicNo.1)  WindowFormのメモリ使用量増加について
  
□投稿者/ alvin (62回)-(2010/02/27(Sat) 11:33:03)

分類:[.NET 全般] 

2010/02/27(Sat) 12:20:02 編集(投稿者)
2010/02/27(Sat) 12:08:45 編集(投稿者)

いつもお世話になっております。
今度も、お世話になります〜

開発環境:VISTA
VS2008
VB.NET

プロセス構成:
プロセスA プロセスB メッセージ表示画面(プロセスC)
なお、プロセス間ではソケット通信を行います。

処理:
プロセスAは外部からデータを受信した場合、
1.受信内容をプロセスBに送信します。

プロセスBはプロセスAから受信した場合、
1.受信した内容を共有メモリに展開します。
2.プロセスCに通知を行います。

プロセスCはプロセスBから通知を受信した場合、
1.共有メモリから取得すべきデータを取得します。
2.取得したデータをDataTableに追加し、それをDataGridViewのDataSourceに設定します。
3.DataTableは最大1000を保存します。共有メモリから取得した件数を足して1000件を超えた場合には、
 DataTableの先頭から削除していきます。

問題:
プロセスAが200通/分を受信する場合、メッセージ表示画面(プロセスC)のメモリ使用量は50MB前後で安定しますが、
プロセスAが600通/分を受信する場合、メッセージ表示画面(プロセスC)のメモリ使用量は段々と増え続けて、10時間ぐらい運用すると、
400MBまで増えることを確認しました。

この増加の原因が把握できないですが、こういう動きは正常でしょうか?
予測:DataTableに問題ないかと思いましたが、最大1000件を保持し、オブジェクトの大きさは一定でした。
ソケット通信で、受信するためのメモリ領域なんとか?ありえるでしょうか?

よろしくお願い致します。

追加1:ソケット通信を行う場合、処理しきれてない部分をメモリにキャッシュ??するのでありえるのでしょうか?
追加2:プロセスのメモリ量が激増する場合、どうゆう方法で原因を調べるのはお勧めでしょうか?

引用返信 編集キー/
■47355 / inTopicNo.2)  Re[1]: WindowFormのメモリ使用量増加について
□投稿者/ 中博俊 (1363回)-(2010/02/27(Sat) 13:12:34)
メモリプロファイラと思ったけどVS2010からだった

windbgでなにが悪いかはまず調べて見ては?

http://wankuma.com/seminar/20091107tokyo39/5.pptx


引用返信 編集キー/
■47357 / inTopicNo.3)  Re[2]: WindowFormのメモリ使用量増加について
□投稿者/ なちゃ (404回)-(2010/02/27(Sat) 13:36:19)
メモリ使用量はタスクマネージャで見た数値でしょうか?
マシンの物理メモリはどのくらいですか?
また、キャッシュ済みはどのくらいの数値で、
利用可能メモリはどのくらい残ってますか?

それから、共有メモリはどういう使い方をしてますか?
GC.GetTotalMemoryでマネージメモリの使用量を調べてみたとき、
プロセスのメモリ使用量が50MB程度の時と400MB程度の時で、
数値に大きな差は有るでしょうか?


引用返信 編集キー/
■47359 / inTopicNo.4)  Re[2]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (63回)-(2010/02/27(Sat) 14:56:47)
No47355 (中博俊 さん) に返信
> メモリプロファイラと思ったけどVS2010からだった
>
> windbgでなにが悪いかはまず調べて見ては?
>
> http://wankuma.com/seminar/20091107tokyo39/5.pptx
>
>
いろいろ試してみてみます〜
情報ありがとうございます。

なちゃ様
長時間運用しないと400Mまでは上がらないので、検証するのは今現在は難しいと。
時間テスト時にはメモッておきます。
ありがとうございます。

引用返信 編集キー/
■47388 / inTopicNo.5)  Re[2]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (64回)-(2010/03/01(Mon) 13:36:18)
2010/03/01(Mon) 13:58:46 編集(投稿者)

中博俊様、なちゃ様

WINDBGを利用して、20M時と400M時のダンプを分析できました。
注:20M時とは、フォーム起動直後且つ共有メモリに1000件のデータがある状態。
  400M時とは、フォーム起動し、最大受信速度で受信し、画面の内容を更新していく状態。

確認結果、一番増えたオブジェクトは、

System.Windows.Forms.DataGirdViewTextBoxCell →3.3万から14万
System.Windows.Forms.PropertySotre+IntegerEntry → 3.3万から14万
System.Windows.Forms.PropertySotre → 3.3万から14万
System.String → 4万から9万

DataGridViewの列数は33、最大表示行数は1000なので、33*1000 = 3.3万で正常だと思いますが、
受信した後、14万まで増えてしまうのは、なぜでしょうか?

質問内容にもありますが、起動DataTableを操作し、それをDataGridViewのDataSourceにセットしています。
受信し、それを足した数が1000超える場合、DataTableの先頭からオーバーした分削除しています。


追記:
WINDBGのシンボルファイルとはなんでしょう?WINDBGのもう少し詳しく説明した情報はないでしょうか?
いろいろ探しているですが、なかなか見つかりません。

現在の端末は、ネットに接続できてない状態です。

オブジェクトの数だけじゃなくて、変数名?なども詳細出力可能でしょうか?


引用返信 編集キー/
■47391 / inTopicNo.6)  Re[3]: WindowFormのメモリ使用量増加について
□投稿者/ はつね (1201回)-(2010/03/01(Mon) 14:43:53)
No47388 (alvin さん) に返信
> DataGridViewの列数は33、最大表示行数は1000なので、33*1000 = 3.3万で正常だと思いますが、
> 受信した後、14万まで増えてしまうのは、なぜでしょうか?
>
> 質問内容にもありますが、起動DataTableを操作し、それをDataGridViewのDataSourceにセットしています。
> 受信し、それを足した数が1000超える場合、DataTableの先頭からオーバーした分削除しています。

削除はどのように行っています?
削除してから、データセットにAcceptChangesしてないとか?

引用返信 編集キー/
■47392 / inTopicNo.7)  Re[4]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (67回)-(2010/03/01(Mon) 15:29:16)
2010/03/01(Mon) 15:29:59 編集(投稿者)

No47391 (はつね さん) に返信
> ■No47388 (alvin さん) に返信
>>DataGridViewの列数は33、最大表示行数は1000なので、33*1000 = 3.3万で正常だと思いますが、
>>受信した後、14万まで増えてしまうのは、なぜでしょうか?
>>
>>質問内容にもありますが、起動DataTableを操作し、それをDataGridViewのDataSourceにセットしています。
>>受信し、それを足した数が1000超える場合、DataTableの先頭からオーバーした分削除しています。
>
> 削除はどのように行っています?
> 削除してから、データセットにAcceptChangesしてないとか?
>

直接RemoveAtを利用しているので、AcceptChangesは要らないかと。
DataTbleの件数はログ出力で監視してましたが、最大1000件を保持していました。
引用返信 編集キー/
■47394 / inTopicNo.8)  Re[5]: WindowFormのメモリ使用量増加について
□投稿者/ 中博俊 (1364回)-(2010/03/01(Mon) 16:13:03)
>質問内容にもありますが、起動DataTableを操作し、それをDataGridViewのDataSourceにセットしています。
>受信し、それを足した数が1000超える場合、DataTableの先頭からオーバーした分削除しています。

というやり方だとDataGridの中身を削除うまくできないのかもしれません。

問題がないのであればDataGridのRowを入れたり消したりじゃなく中身を書き換える方がいいかもしれません。

stringについてはインターンプールなので、しかたないかな・・・

引用返信 編集キー/
■47395 / inTopicNo.9)  Re[5]: WindowFormのメモリ使用量増加について
□投稿者/ はつね (1202回)-(2010/03/01(Mon) 16:13:52)
No47392 (alvin さん) に返信
> 直接RemoveAtを利用しているので、AcceptChangesは要らないかと。
> DataTbleの件数はログ出力で監視してましたが、最大1000件を保持していました。

RemoveAtしてもメモリ空間解放していない可能性も。
1000件超えたら先頭に戻ってDataSetの中身をUpdateして、あとはソート表示で対応とかすれば
メモリ使用量増えないかも。

引用返信 編集キー/
■47396 / inTopicNo.10)  Re[3]: WindowFormのメモリ使用量増加について
□投稿者/ なちゃ (405回)-(2010/03/01(Mon) 16:22:50)
まあそれ以前に、本当にマネージメモリを消費してるのか自体が不明ですし、一度
No47357
で書いた辺りを確認してみて下さい。

33000→140000になった程度で、メモリ使用量は20倍になってるのですから、
共有メモリの使い方の方も確認がいるんじゃないかと思います。

引用返信 編集キー/
■47398 / inTopicNo.11)  Re[6]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (68回)-(2010/03/01(Mon) 17:11:27)
中博俊様
ソートはしなく、最新のものは常に一番最後なので、書き換えるためには、コストはもっとかかるのではないでしょうか?

はつね様
ソートはしていません。

なちゃ様
これから、その確認を行います。
引用返信 編集キー/
■47399 / inTopicNo.12)  Re[7]: WindowFormのメモリ使用量増加について
□投稿者/ はつね (1203回)-(2010/03/01(Mon) 17:33:58)
No47398 (alvin さん) に返信
> はつね様
> ソートはしていません。

1000行いったら先頭に戻って書き換えるようにするならソート必要でしょ?

あとメモリ使用量とコストのどちらが重要かも判断する必要がありますが質問はメモリ使用量ですよね?

実際に試してみてメモリ使用量が減るのか、本当にコストが許容範囲に収まらないかを検証してみた
方がいいですよ。そして、検証評価できるのは評価対象のメモリ容量とCPUと同時稼働プログラムが動い
ているPCをお持ちの質問者以外には世界中に誰もいないかと。



引用返信 編集キー/
■47400 / inTopicNo.13)  Re[8]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (70回)-(2010/03/01(Mon) 18:00:54)
No47399 (はつね さん) に返信
> ■No47398 (alvin さん) に返信
>>はつね様
>>ソートはしていません。
>
> 1000行いったら先頭に戻って書き換えるようにするならソート必要でしょ?
>
> あとメモリ使用量とコストのどちらが重要かも判断する必要がありますが質問はメモリ使用量ですよね?
>
> 実際に試してみてメモリ使用量が減るのか、本当にコストが許容範囲に収まらないかを検証してみた
> 方がいいですよ。そして、検証評価できるのは評価対象のメモリ容量とCPUと同時稼働プログラムが動い
> ているPCをお持ちの質問者以外には世界中に誰もいないかと。
>
そもそもソートする条件がありません。
受信した順番に追加するだけで、それを一行目に上書きして、それを最後に表示する条件がないです。
やろうとしたら受信時間保存してやるとか。。。。。。。
いろんな面で、ソートの実装はむずかしいとこがあるかとおもいます。


引用返信 編集キー/
■47401 / inTopicNo.14)  Re[9]: WindowFormのメモリ使用量増加について
□投稿者/ 中博俊 (1365回)-(2010/03/01(Mon) 18:33:53)
> そもそもソートする条件がありません。
> 受信した順番に追加するだけで、それを一行目に上書きして、それを最後に表示する条件がないです。

それがソート条件じゃないですか^^;;

> やろうとしたら受信時間保存してやるとか。。。。。。。

別に入れる順番に番号振っておけばいいだけですし

ソートするのが本題じゃないんですが、たとえばCellのリムーブが出来ていないのかもしれないですし、出来ているかもしれません。
またGC.Collectしたら消えるかもしれませんし、消えないかもしれません。

どこから参照が残っているかなんかも調査してみないとね−。。。。


引用返信 編集キー/
■47402 / inTopicNo.15)  Re[10]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (72回)-(2010/03/01(Mon) 18:44:19)
2010/03/01(Mon) 19:32:12 編集(投稿者)

No47401 (中博俊 さん) に返信
>>そもそもソートする条件がありません。
>>受信した順番に追加するだけで、それを一行目に上書きして、それを最後に表示する条件がないです。
>
> それがソート条件じゃないですか^^;;
>
>>やろうとしたら受信時間保存してやるとか。。。。。。。
>
> 別に入れる順番に番号振っておけばいいだけですし
>
> ソートするのが本題じゃないんですが、たとえばCellのリムーブが出来ていないのかもしれないですし、出来ているかもしれません。
> またGC.Collectしたら消えるかもしれませんし、消えないかもしれません。
>
> どこから参照が残っているかなんかも調査してみないとね−。。。。
>
>
「そもそも受信順番で表示すればいい」ということで、ソートは考えなくていいかと。
メモリ使用量とパフォーマンスどっちを取るというなら、パフォーマンスです。

GC.Collectはこれからやってみて、追加します。
追記:GC.Collectを実行してもメモリは開放されません。





引用返信 編集キー/
■47403 / inTopicNo.16)  Re[3]: WindowFormのメモリ使用量増加について
□投稿者/ alvin (73回)-(2010/03/01(Mon) 18:52:52)
2010/03/01(Mon) 19:01:14 編集(投稿者)
2010/03/01(Mon) 19:01:10 編集(投稿者)
2010/03/01(Mon) 18:54:16 編集(投稿者)

<pre><pre>■No47357 (なちゃ さん) に返信
> メモリ使用量はタスクマネージャで見た数値でしょうか?
> マシンの物理メモリはどのくらいですか?
> また、キャッシュ済みはどのくらいの数値で、
> 利用可能メモリはどのくらい残ってますか?
> 
> それから、共有メモリはどういう使い方をしてますか?
> GC.GetTotalMemoryでマネージメモリの使用量を調べてみたとき、
> プロセスのメモリ使用量が50MB程度の時と400MB程度の時で、
> 数値に大きな差は有るでしょうか?
> 
> 

タスクマネージャ
-------------------------------------------------------------
               合計   キャッシュ済み   空きメモリ
-------------------------------------------------------------
起動後     2013    940        102
長時間受信後  2013        796                 8


リソースモニター
--------------------------------------------------------------------------------
                コミット     ワーキングセット     共有可能    プライベート
--------------------------------------------------------------------------------
起動後     31,040        39,084              6,984        12,100
長時間受信後  401,172         291,084             29,744       261,340


起動後20Mが300M前後まで増えた時点です。




</pre></pre>

引用返信 編集キー/
■47406 / inTopicNo.17)  Re[11]: WindowFormのメモリ使用量増加について
□投稿者/ 中博俊 (1366回)-(2010/03/01(Mon) 19:16:50)
タスクマネージャーの数字はなんの役にも立たないので・・・
GC.TotalMemoryだっけ?その辺の値の推移をチェックしてください。またはパフォーマンスモニター

んで、調べるだけじゃ意味がないので、CellをひっつかまえてDisposeするとかいろいろやってみてください。
引用返信 編集キー/
■47408 / inTopicNo.18)  Re[12]: WindowFormのメモリ使用量増加について
□投稿者/ なちゃ (406回)-(2010/03/01(Mon) 19:52:55)
No47406 (中博俊 さん) に返信
> タスクマネージャーの数字はなんの役にも立たないので・・・

目的を間違って見てて意味がないなんてことはよくありますが、
何の役にも立たないってのは言いすぎでは?

ワーキングセットサイズとコミットサイズ、
その時点で物理メモリに余裕がありそうかなど
一応確認しておきたいことはありますし。

まあそれとは別途、マネージメモリの使用状況はもちろん必要ですが。

引用返信 編集キー/
■47419 / inTopicNo.19)  Re[11]: WindowFormのメモリ使用量増加について
□投稿者/ はつね (1204回)-(2010/03/02(Tue) 10:48:56)
No47402 (alvin さん) に返信
> 「そもそも受信順番で表示すればいい」ということで、ソートは考えなくていいかと。

受信順番で表示しているわけではなく、DataTableに受信した順番で入れているから何もソートせずに
DataTableの先頭から表示したら順番になっていたってことですよね。

で、私が言いたいのは、1000行って行数でメモリ使用量を頭打ちにしたいなら、削除と追加でやるの
ではなく、上書き更新して再利用した方がいいですよということ。で、再利用するならDataTableの
先頭から表示しても受信順にならないからソートが必要でしょうということ。

たぶん、質問者の人は、RDBMSが削除と追加を行ったときにどういう動きをするのかとか、なんで
Accessのmdbファイルは使っているとファイルサイズが増えて最適化が必要かだとか、デフラグな
んてものがなんであるかとか、そのあたりのことが思い浮かばないので、話がかみ合わないよう
な気がします。

引用返信 編集キー/
■47422 / inTopicNo.20)  Re[12]: WindowFormのメモリ使用量増加について
 
□投稿者/ なちゃ (407回)-(2010/03/02(Tue) 11:39:42)
個人的には、解放漏れや確保解放の負荷が問題になるほど高くはないとは思うんですけどね。
ただまあもちろん、現象自体を軽減する効果はあるかも知れません。

140000だと、解放漏れとか問題が起こってるにしては少ない気がします。
つまり単にまだGCされてないだけな気がします。

GCしてもメモリは減らなかったという事ですが、これはタスクマネージャの表示とかですよね?
だとすれば、状況にもよりますが、きちんとGCで解放されても、
プロセス自体のメモリ使用状況は変わらない場合もありますので、
GCで漏れが発生しているかどうかまでは確認できません。
長時間稼働でかつ物理メモリに余裕があるということなら、普通に正常な動作の可能性もあります。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -