http://linux.papa.to/image/tokyocabinet-1.4.45.scost.patch.tar.gz がパッチとバッチ。 彗星の煌めきのごときmikio wareに、俺のゴミパッチを当てたら当然 クォリティは下がりますので、そこんとこよろしく。責任とれまへん。 ライセンスはオリジナル準拠です。
TokyoTyrantのサーバであるttserverを起動しておいて、
% sh server.sh [ENTER]
setindex.plを実行してインデックスを作成し、ins.plで100万レコードを 登録したデータベースに対して、search.plで複合検索を行う、という実験です。 パッチ自体はTokyoCabinetに対するものですが。
登録するデータは、ニコニコ動画のタグや掲示板の書き込みのようなものを思い浮かべてください。 投稿者(uname)と、投稿本文またはタグ(ptoken)と、投稿時刻(time)がある。 時刻はUNIX起源時間にすると見辛いので1〜100万までの整数にしてある。
key | time | uname | ptoken |
jIuqHzqZd3QdXy4QeuFwEfwt | 1 | AABC | ucuuZRAU,jfb5XOyr,gI2CfCZ6,sSlCsZXQ,aYoC9JOS,0GK6visU,aOGmIH8M |
UC8A5Q13PYNYvYe0EOjyjiLq | 2 | DADB | 897IZiAU,e0k5ap06,i85jkur3,qWJcRIHm |
9dwkWmPq30ApknRfPHTf8xei | 3 | CCFA | p9Vlhd89,1KBZrZ1h,FwRgzl7r,Y5zBfLgT,uEEtvZ7F |
search.plは、このTTに対して複合的な検索クエリーを発行する。例えば 「ある開始時刻〜終了時刻の、ユーザほげほげさんの投稿を、古い順に100件探す」みたいなかんじです。 ありがちな処理でしょ?
my $qry = TokyoTyrant::RDBQRY->new($db); my $start = ($j * 12345) % 1000000; my $end = $start + 3600; my $user = $users[$j % 50]; print "TIMERANGE: $start - $end USER $user\n"; $qry->addcond('uname', $qry->QCSTREQ, $user); $qry->addcond('time', $qry->QCNUMGE, $start); $qry->addcond('time', $qry->QCNUMLE, $end); $qry->setorder('time', $qry->QONUMASC); $qry->setlimit(100); my $rv = $qry->search();
完全乱数だと実行結果の比較がしにくいので、検索時刻範囲やユーザ名は、 剰余によって、同じものが決まった順番で繰り返し出るように細工してあります。
![]() |