- PR -

ASP.NETWebサービスのメモリ使用量について

1
投稿者投稿内容
じゅんじゅん
会議室デビュー日: 2004/01/24
投稿数: 4
投稿日時: 2008-07-07 22:34
IIS6.0(Windows 2003 Server)でASP.NET1.1(C#1.1)で作成したWebサービスを配置しています。
Webサービスのパラメータとしては、テキストを圧縮しBase64エンコードした文字列を渡しています。
メモリ使用量確認テストとしてその文字列のサイズが80MB位の場合でWebサービスを実行したところ、
Webサービスのメソッドに入った直後(Webサービスはまだ何もしていない)にデバック出力したGC.GetTotalMemoryの値が800MB近くになっており(文字列をファイルに保存して当該パラメータにnullをセット、
GC.Collectを実行したら200MB程度まで下がりましたが)、何でそんなにメモリを使用するのかよくわかりません(SOAPヘッダ等を考慮しても100MBは超えないと思うのですが・・・)。
マシンの物理メモリに応じて(余裕があると?)ASP.NET(ワーカープロセス?)が大量にメモリを取得してしまうような話も聞いたことがあるのですが、ASP.NET(ワーカープロセス?)の動きとして必要以上?のメモリ取得(ASP.NET側で最適なメモリ量を取得している?)は正しい動きなのでしょうか?
マシンの物理メモリは2GBで、IISの設定でmemoryLimitは60(%)です。
以上、よろしくお願いいたします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-07-08 12:57
引用:

Webサービスのメソッドに入った直後(Webサービスはまだ何もしていない)にデバック出力したGC.GetTotalMemoryの値が800MB近くになっており


文字列型は、変数に代入したり、関数の引数で渡す度にコピーが作成されます。
Webサービスのメソッドに到達する前に80Mbyteの文字列のコピーが数回作成されたのでしょう。

引用:

Webサービスのパラメータとしては、テキストを圧縮しBase64エンコードした文字列を渡しています。


テキストを圧縮したバイナリをそのままbyte配列で渡せばよいと思います。
ちなみに、転送時にバイナリ/Base64変換が暗黙に行われます。

[ メッセージ編集済み 編集者: todo 編集日時 2008-07-08 14:12 ]
じゅんじゅん
会議室デビュー日: 2004/01/24
投稿数: 4
投稿日時: 2008-07-08 21:29
ご回答ありがとうございます。

引用:

テキストを圧縮したバイナリをそのままbyte配列で渡せばよいと思います。


バイト配列で渡すと200MB弱まで少なくなったので、バイト配列で渡すことにしました。
ただ、バイト配列でも200MBほど使用する仕組みがよくわかりませんが。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-07-08 23:34
引用:

じゅんじゅんさんの書き込み (2008-07-08 21:29) より:
バイト配列で渡すと200MB弱まで少なくなったので、バイト配列で渡すことにしました。
ただ、バイト配列でも200MBほど使用する仕組みがよくわかりませんが。


Webサービス側でやってる処理が良くわからないんですが、読んでる感じだと、受け取ったバイト配列を伸長して文字列に戻してファイルに保存、な感じでしょうか?
※200MBと考えると少し違うような気もしますが

例えば処理の流れを考えると、
1.リクエストの大元のストリーム
2.XMLとして処理した結果のBASE64文字列
3.Webサービスの定義にあわせてそれをデコードしたバイト配列
4.それを伸長したバイト配列
5.それを文字列に戻した文字列
それぞれ使用するのは一時的とはいえ、数十MBレベルのメモリをこれだけ使うわけで、
かつ使用しなくなったメモリはGC(それもフルGC)がが発生しないと物理的に開放
されないのですから(この表現も微妙ではありますが)、200MB程度使うのは当たり前な気がします。

※上記いずれも、一時的には少なくとも2つ分同時に確保したままになるのはわかりますよね?
 もちろん実装によって絶対とはいえない部分はありますが。
1

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