namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

I should have known how to use pack 'w' ;-)



ついさきほど pack 'w' の使い方を覚えました。これは整数を圧縮した形
で保存する機能で、Perl 5.004 から導入されています。今まで知らなかっ
たのが実に残念です。

まず、 NMZ.i, NMZ.p は pack 'w' を簡単に適用できます。さらに、
namazuが seekする際の計算に頭を使えば NMZ.ii, NMZ.pi, NMZ.h, NMZ.f 
あたりもいけると思います。

そうなれば全体のインデックスのサイズは約半分になるはずです (規模に
よって変わりますが)。素晴らしいと思いませんか? :-)

原理:

  % perl -e 'print pack("i*",1,2,3,100,200,300,10000,20000,30000)' \
    | od -t x1
  0000000 01 00 00 00 02 00 00 00 03 00 00 00 64 00 00 00
  0000020 c8 00 00 00 2c 01 00 00 10 27 00 00 20 4e 00 00
  0000040 30 75 00 00
  0000044
  % perl -e 'print pack("w*",1,2,3,100,200,300,10000,20000,30000)' \
    | od -t x1
  0000000 01 02 03 64 81 48 82 2c ce 10 81 9c 20 81 ea 30
  0000020

...

ちなみに、 pack 'w' の使い方は The Perl Journal に載っていた

  * Information Retrieval and pack 'w'
    by Ulrich Pfeifer

の記事を読んで覚えました。freeWAIS-sf + SFgate の開発者が転置イン
デックス法の全文検索システムの実装をわずか 4ペイジでわかりやすく解
説しています。

これを最初に読んでいたら Namazuはまるっきり違ったものになっていた
でしょう (そもそも作らなかったかも;-)。 Ulrich の実装はオブジェク
ト指向でスマートです。

それから for my $tmp () なるイディオムも覚えました (便利だ!)。これ
も 5.004以降じゃないと使えないみたいです。

というわけで Namazu の次の版からは require 5.004 にします。

# The Perl Journal は 2週間ほど前に頼んで今日届きました。バックナ
# ンバーすべて (11冊) + 2年購読で $122なり。

-- Satoru Takabayashi