2009-04-15 9 views
2

私はASP.NETセッションでデータをかなり入れているような気がしますが、どれくらいのことを心配する必要はありません。 similar questionが見つかりましたが、オブジェクトのシリアル化とシリアル化されたサイズの確認が必要です。私の場合、セッションのデータの大部分は、「シリアライズ可能」としてマークされたクラスを持たない別のライブラリのオブジェクトにあります。 (これはInProcセッションステートプロバイダの使用を制限していることを知っていますが、それは別の問題です)。誰かがオブジェクトグラフをどのように横断してそのサイズを調べるかについてのアイディアを持っていますか?ASP.NETセッションのサイズを調べるには、シリアル化されていないオブジェクトがある場合はどうすればよいですか?

追加: OK、片方向は、オブジェクトグラフの手動トラバーサルとMarshal.SizeOf()メソッドの使用方法です。しかしそれはそれを働かせるための多くの執筆です。同じ効果を達成するための簡単な方法はありますか?私はバイト精度を目指しているわけではありませんが、大きさの順番(キロバイト、メガバイト、数十メガバイト)に興味があります。

答えて

-1

データベースにセッション状態情報を格納し、オブジェクトグラフを表示してトラバースできるツールがあるかどうかはわかりません。

可能であれば、デザインをもう一度チェックして、セッション内の情報を最小限に抑えることができるかどうかを確認してください。

+0

注意深くお読みください!小文字で書かれたどこかには、「直列化できないオブジェクト」に関する言葉が2つあります。私はそれをバイトストリームに変換することはできず、ずっとDBに入れません! –

+0

そして、メモリの最適化に関しては、 "トリッキーで巧妙な最適化の仕方"に頼らずに、コードを最小限に抑えています。私はそれをもっと絞ることができるかもしれませんが、それは大きな努力を要するでしょう。私はそれがそれの価値があるかどうかを知りたい。 –

+0

こんにちはVilx、非直列化可能なオブジェクトに関する詳細を教えてください。 –

1

テストのために、SessionStateStoreProviderBase抽象クラスを実装するスタブカスタムセッションプロバイダをまとめることができます。 SetAndReleaseItemExclusiveメソッドが呼び出されたときに、Marshal.SizeOf()メソッドを使用して統計情報を生成し、最終的にWebCacheのすべてを隠して(セッションデータを管理するように)バッキングフィールドを記述します。

 public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) 
     { 

     double MemSize = 0; 
     foreach (object sessObj in item.Items) 
     { 
      MemSize += Marshal.SizeOf(sessObj); 
     } 

} 

フィールドサイズを取得の詳細については、この質問を参照してください: Getting the size of a field in bytes with C#

+0

http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx - "このメソッドは、構造体のインスタンスを受け入れます。これは、参照型またはボックス化された値型になります。レイアウトは、順次または明示的でなければなりません" – meandmycode

+0

これは、グラフ全体ではなく、オブジェクトのサイズを教えてくれるのではないですか?問題は、私はセッションに単純なオブジェクトを置かないということです。そこにはDataTable全体(またはDataTableから派生したクラス)があります。また、1つの項目がセッションのいくつかのキーの下にあります。 –

+0

右には、オブジェクトのサイズを正確に計算するためにオブジェクトグラフをトラバースする必要があります。これは、シリアル化できないためです。そのためには、いくつかの重い再帰反射作業を行う必要があります。これにより、ページ構造外のセッションサイズを分析することができます。 –

1

あなたは、ヒープ・ダンプを生成し、そのセッションからのサイズを見つけることができません。 Javaの土地では、ヒープをダンプしてからmatで開き、セッションオブジェクトを見つけてサブグラフのサイズを調べることができます。

+0

サードパーティのツールを使用していない場合はできません...しかし、それはアイデアです。以前は ".NET Memory Profiler"を使用していましたが、それは良いことでした。おそらく、この場合にも役立つ可能性があります。 –

関連する問題