- PR -

メモリ内でのサイズについて

投稿者投稿内容
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-08-22 11:33

こんにちは。
いつもお世話になっております。

現在、VB.net2003にてC/Sアプリケーション開発を行っております。

さっそくの質問なのですが、Hashtable等のメモリ内でのサイズの
取得等は可能なのでしょうか?
文字列、構造体からの取得方法はわかったのですが・・・。
そもそも出来ない・・・><

知識が乏しく検討違いの質問かも知れませんが、
どうか、よろしくお願いいたします。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-08-22 14:34
リフレクションを使って HashTable 内部のフィールドを取得し、
そのフィールドに対してリフレクションを使って内部フィールドを取得し・・・・
と再帰的に取得したフィールドのサイズを合計すれば取得できなくもないような。

(格納オブジェクトの平均サイズ+1つ格納するのに必要なサイズ)×個数+α

のような概算式があるといいんでしょうけど見たことはないですね。

HashTable、AllayList、配列などそれぞれ特徴を考えて最適なものを選びましょう、
とはよく言われていますね。
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-08-22 14:45

さっそくのご返信ありがとうございます。
やっぱりそうですか・・・。

HashTableには何が格納されているかわからないですからね。。。

ちなみに、当方がやりたかったことですが、サーバとの通信時に
データ(HashTable)をシリアライズして受け渡しをしているのですが、
その受け渡しをしているデータのサイズを取得したいと思ったのです。
で、シリアライズ前のデータ(HashTable)のサイズが取得できないかと思いまして。

シリアライズされた後のサイズが取れたりするか、もう少し調べてみます。

ありがとうございました。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-08-22 14:49
シリアライズ「後」のデータの形式は
バイト配列とかBASE64文字列ではありませんか?

どちらもサイズはとれますよね?

.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-08-22 16:36

masa様>何度もご返答ありがとうございます。

シリアライズ後データを取得を試みたのですが、
シリアライズ事態は本システムで使用しているフレームワークがやっているので
無理でした。

サーバ側PGにてデータ通信量を取得できるような方法を調べて見ることにします・・・。(出来るのかもわからないので・・・)

何度もありがとうございます。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-22 20:02
引用:

.netさんの書き込み (2006-08-22 16:36) より:
シリアライズ後データを取得を試みたのですが、
シリアライズ事態は本システムで使用しているフレームワークがやっているので
無理でした。


フレームワークというのがどのような処理をしているのか分かりませんが、
仕組みが分かるのなら、それに合わせた形で自分でシリアライズして確認する
ことはできると思います。

例えばRemotingのバイナリフォーマットを使用しているなら、
バイナリフォーマッタで自分でシリアライズしてサイズを確認する、などです。

引用:

サーバ側PGにてデータ通信量を取得できるような方法を調べて見ることにします・・・。(出来るのかもわからないので・・・)


まあこれができるならこちらの方がいいでしょうね。
IISにホストしてるサーバアプリケーションとかなら
比較的簡単に調べられる可能性はありますが…
※あるいは何らかの通信横取り系ツールを使うなど。
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-08-22 20:11
さっそくのご返信ありがとうございます。

引用:

例えばRemotingのバイナリフォーマットを使用しているなら、
バイナリフォーマッタで自分でシリアライズしてサイズを確認する、などです。



考えついたのですが、無駄なシリアライズになるので、やめました・・・。
(そこまでしてしたい処理でない為です。)

引用:

IISにホストしてるサーバアプリケーションとかなら
比較的簡単に調べられる可能性はありますが…



引き続き調査をしております。。。
ヒントをいただけただけでも良かったです。

ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-22 22:24
 これって、最終的に何がしたいのでしょう?
 受け渡しするのにシリアライズを行っていて、シリアライズする前のサイズがわかって、どうするのでしょう?正しく送信できたかどうかは、送信するシリアライズしたもののサイズを知らなければならないのでは、ないですか?


 masa さんの計算式は、微妙ですね。HashTable インスタンスにオブジェクトを突っ込んでも、HashTable インスタンスが保持するのはオブジェクトへの参照と、オブジェクトのハッシュ値ですから、オブジェクトのサイズを“HashTable のサイズ”に含めていいのでしょうか?(元質問に対する言葉遊び)
 また、n個突っ込んだからといって、n個分のバケットが確保されているかというと、そうでもありません。そんなことすると、すぐにコリジョンが発生します。そうではなく、N個格納する予定だから、N+αのバケットを用意し、ハッシュ値が分散するようにハッシュ関数を調整するのではないでしょうか。


 あるいは、他のコンピュータにデータを送信するのに、HashTable を送る必要はないのですから、HashTable のインスタンスの大きさを求める必要はないと思います。こちらからはデータ配列を送り、あちらで HashTable に格納してもらえばいいのです。そうすると、ハッシュ値を送らなくていいぶん、送信するデータ量は減ります。

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