高橋です。
前回寺西さんにご指摘いただいたところを参考に
NMZ.iを縮小する方法を考えてみました。
現在のNMZ.iの構造は、
[単語xのデータ量][Docid][score]...
となっていますが、以下のようにしてみました。
[単語xのデータのBERSIZEの超過分][Docid][score]...
非常にわかりずらいですね。
つまり、最初のデータは、DOCIDとスコアの、BER圧縮したbyteが
2以上の場合、インクリメントします。
例えば、[Docid][score]
[127] [20] [128][10] [1][130]
の場合、128を超えるのは2つあるので、2が入ります。
もちろん、16384を超えると、+2になります。
ここで、単語xのデータのBERSIZEの超過分をextrabyte(x)とします。
それで、単語xのデータ量の求め方は、
NMZ.ii(x+1) - NMZ.ii(x) - extrabyte(x) - byte(extrabyte(x))
で求めます。
(BER圧縮を使うとほとんど1byte、1byteに一つの値が入ることが
多いのでbyte計算から読み込むデータ量を求められる)
NMZ.pについても同様にしました。
これにより、利点は、
1.データが圧縮!
2.NMZ.iから単語xのデータすべてを読まなくても、
必要データ量が求められる!
1.に関しては、約1.7MのNMZ.iが1Kほど縮小されました。
2.に関しては、hlist.cでのnmz_get_hlist()のトリックが
楽になっています。
改変したファイルを添付しますので、ご感想をよろしくお願いいたします。
ちなみに、変数のネームセンスがないため、不適当な名前を
つけているかもしれませんが、ご容赦ください。
むしろ良い案をいただけると助かります。
また、いっていることと違う、ここにバグがある等もありましたら
お教えください。
P.S.
このアルゴリズムを元に、更なる縮小化がぼんやりと頭にうかんでいます。
ですのでバシバシご意見をいただけるとうれしいです。
図書館情報大学4年
高橋英幸<k176@xxxxxxxxxx>Attachment:
namazu_data.tar.gz
Description: application/gzip-compressed