Rhino(java)を使ったServer-side JavaScript(MaachangComet)を開発しています。
今回は、Hash管理値を変更しました。
具体的には、下記の通りです。
今まで、Hash管理値を0x0000ffffとしていましたが、この場合、
最大データ長4250000 / 0x0000ffff = 約64となり、たとえば、
最大データ長分データを入れた場合、今までのHash値の場合、Hash衝突
平均が64となります。これだと、非常に検索効率が悪いのは、言うまでも
ありません。
なので、今回は、Hash管理値を0x000fffffとしました。この場合、
最大データ長4250000 / 0x000fffff = 約4となり、以前と比べると、
Hash衝突平均が4になります。
また、以下にファイルフォーマット表を添付します。
--------------------------------------------------------------------------------
1.Keyフォーマット.
A.((4byte * 1048575) + (8*64) = 4194812byte).
key開始ポジション管理(4byte).
B.1Key情報(532byte * 最大4250000件 = 2261000000byte).
key有効フラグ(1byte).
hashコード(4byte).
hash衝突に対するbeforeポジション(4byte).
hash衝突に対するnextポジション(4byte).
valueファイル項番(2byte).
valueファイル内開始ポジション(4byte).
key長(2byte).
key内容(512byte).
C.空きフラグ管理(531264byte).
全体スペース(4byte).
有効スペース(4byte).
管理int配列数(4byte).
int配列内容(((4250000 / 32)+((4250000 % 32)==1)) * 4 = 531252byte).
Aが1ファイル.
C+(B*n個)が1ファイル.
--------------------------------------------------------------------------------
2.Valueフォーマット((8206byte * 65536) + 8208byte = 537796624byte).
A.セクタサイズ(8206byte * 65536).
beforeファイル項番(2byte).
before項番(4byte).
nextファイル項番(2byte).
next項番(4byte).
データ長(2byte).
データ(8192byte).
B.空きフラグ管理(8204byte).
全体スペース(4byte).
有効スペース(4byte).
管理int配列数(4byte).
int配列内容(((65536 / 32)+((65536 % 32)==1)) * 4 = 8192byte).
B+Aが1ファイル.
Valueファイルは、最大1024個まで、自動作成※される。
※利用可能セクタが存在しない場合において。
また、ファイル項番の管理は、ファイル名で解決する。[番号.sector]のように。
--------------------------------------------------------------------------------
データの最大数は425万件.
・Hash管理値を0x0000ffffから0x000fffffに変更しました。