- - PR -
メモリ内でのサイズについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-22 11:33
こんにちは。 いつもお世話になっております。 現在、VB.net2003にてC/Sアプリケーション開発を行っております。 さっそくの質問なのですが、Hashtable等のメモリ内でのサイズの 取得等は可能なのでしょうか? 文字列、構造体からの取得方法はわかったのですが・・・。 そもそも出来ない・・・>< 知識が乏しく検討違いの質問かも知れませんが、 どうか、よろしくお願いいたします。 | ||||||||
|
投稿日時: 2006-08-22 14:34
リフレクションを使って HashTable 内部のフィールドを取得し、
そのフィールドに対してリフレクションを使って内部フィールドを取得し・・・・ と再帰的に取得したフィールドのサイズを合計すれば取得できなくもないような。 (格納オブジェクトの平均サイズ+1つ格納するのに必要なサイズ)×個数+α のような概算式があるといいんでしょうけど見たことはないですね。 HashTable、AllayList、配列などそれぞれ特徴を考えて最適なものを選びましょう、 とはよく言われていますね。 | ||||||||
|
投稿日時: 2006-08-22 14:45
さっそくのご返信ありがとうございます。 やっぱりそうですか・・・。 HashTableには何が格納されているかわからないですからね。。。 ちなみに、当方がやりたかったことですが、サーバとの通信時に データ(HashTable)をシリアライズして受け渡しをしているのですが、 その受け渡しをしているデータのサイズを取得したいと思ったのです。 で、シリアライズ前のデータ(HashTable)のサイズが取得できないかと思いまして。 シリアライズされた後のサイズが取れたりするか、もう少し調べてみます。 ありがとうございました。 | ||||||||
|
投稿日時: 2006-08-22 14:49
シリアライズ「後」のデータの形式は
バイト配列とかBASE64文字列ではありませんか? どちらもサイズはとれますよね? | ||||||||
|
投稿日時: 2006-08-22 16:36
masa様>何度もご返答ありがとうございます。 シリアライズ後データを取得を試みたのですが、 シリアライズ事態は本システムで使用しているフレームワークがやっているので 無理でした。 サーバ側PGにてデータ通信量を取得できるような方法を調べて見ることにします・・・。(出来るのかもわからないので・・・) 何度もありがとうございます。 | ||||||||
|
投稿日時: 2006-08-22 20:02
フレームワークというのがどのような処理をしているのか分かりませんが、 仕組みが分かるのなら、それに合わせた形で自分でシリアライズして確認する ことはできると思います。 例えばRemotingのバイナリフォーマットを使用しているなら、 バイナリフォーマッタで自分でシリアライズしてサイズを確認する、などです。
まあこれができるならこちらの方がいいでしょうね。 IISにホストしてるサーバアプリケーションとかなら 比較的簡単に調べられる可能性はありますが… ※あるいは何らかの通信横取り系ツールを使うなど。 | ||||||||
|
投稿日時: 2006-08-22 20:11
さっそくのご返信ありがとうございます。
考えついたのですが、無駄なシリアライズになるので、やめました・・・。 (そこまでしてしたい処理でない為です。)
引き続き調査をしております。。。 ヒントをいただけただけでも良かったです。 ありがとうございました。 | ||||||||
|
投稿日時: 2006-08-22 22:24
これって、最終的に何がしたいのでしょう?
受け渡しするのにシリアライズを行っていて、シリアライズする前のサイズがわかって、どうするのでしょう?正しく送信できたかどうかは、送信するシリアライズしたもののサイズを知らなければならないのでは、ないですか? masa さんの計算式は、微妙ですね。HashTable インスタンスにオブジェクトを突っ込んでも、HashTable インスタンスが保持するのはオブジェクトへの参照と、オブジェクトのハッシュ値ですから、オブジェクトのサイズを“HashTable のサイズ”に含めていいのでしょうか?(元質問に対する言葉遊び) また、n個突っ込んだからといって、n個分のバケットが確保されているかというと、そうでもありません。そんなことすると、すぐにコリジョンが発生します。そうではなく、N個格納する予定だから、N+αのバケットを用意し、ハッシュ値が分散するようにハッシュ関数を調整するのではないでしょうか。 あるいは、他のコンピュータにデータを送信するのに、HashTable を送る必要はないのですから、HashTable のインスタンスの大きさを求める必要はないと思います。こちらからはデータ配列を送り、あちらで HashTable に格納してもらえばいいのです。そうすると、ハッシュ値を送らなくていいぶん、送信するデータ量は減ります。 |