前回は、
ブロックの拡張問題
前回、
レコード位置 | 内容 |
---|---|
0 | ブロックサイズ |
1 | 見だし語 |
2 | データ1 |
3 | データ2 |
4 | データ3 |
5 : : : |
データ4 : : : |
このブロックには、
転置インデックスの作成当初は対象とする文書数が少ないので、
FINDSPOTの初期の実装
FINDSPOTの初期の実装では、
レコード位置 | 内容 |
---|---|
0 | ブロックサイズ |
1 | 見だし語 |
2 | 次のブロック位置 |
3 | データ1 |
4 | データ2 |
5 | データ3 |
6 : : : |
データ4 : : : |
最初に作成するブロックは16レコード分です。この時、
また、
ブロック数 | レコードサイズ | 格納できるデータ数 |
---|---|---|
1 | 16 | 13 |
2 | 16 | 26 |
3 | 16 | 39 |
4 | 16 | 52 |
5 | 16 | 65 |
6 | 32 | 94 |
7 | 32 | 123 |
8 | 32 | 152 |
9 | 32 | 181 |
10 | 32 | 210 |
11 | 64 | 271 |
12 | 64 | 332 |
13 | 64 | 393 |
14 | 64 | 454 |
15 | 64 | 515 |
16 | 128 | 640 |
17 | 128 | 765 |
18 | 128 | 890 |
19 | 128 | 1015 |
20 | 128 | 1140 |
21 | 256 | 1393 |
22 | 256 | 1646 |
23 | 256 | 1899 |
24 | 256 | 2152 |
25 | 256 | 2405 |
26 | 512 | 2914 |
27 | 512 | 3423 |
28 | 512 | 3932 |
29 | 512 | 4441 |
30 | 512 | 4950 |
31 | 1024 | 5971 |
32 | 1024 | 6992 |
33 | 1024 | 8013 |
34 | 1024 | 9034 |
35 | 1024 | 10055 |
36 | 2048 | 12100 |
37 | 2048 | 14145 |
38 | 2048 | 16190 |
39 | 2048 | 18235 |
40 | 2048 | 20280 |
41 | 4096 | 24373 |
42 | 4096 | 28466 |
43 | 4096 | 32559 |
44 | 4096 | 36652 |
45 | 4096 | 40745 |
46 | 8192 | 48934 |
47 | 8192 | 57123 |
48 | 8192 | 65312 |
49 | 8192 | 73501 |
50 | 8192 | 81690 |
51 | 8192 | 89879 |
52 | 8192 | 98068 |
53 | 8192 | 106257 |
この表によると、
このブロック数を拡張する方法は、
ハードディスクのスピード
実はブロック数を拡張する方法の検索性能が思わしくない大きな理由は、
ハードディスクはレコードのようなディスクと呼ばれる円盤が回転する構造になっており、
ハードディスクの読み書きスピードは、
- 位置決め時間
(シークタイム) ハードディスクの磁気ヘッドはアームの先に取り付けられています。この磁気ヘッドが目的のトラックに移動してからでないと、
トラック上の情報を読み書きできません。磁気ヘッドの移動に要する時間が、 位置決め時間になります。位置決め時間はハードディスクによってさまざまですが、 近年のドライブならば8~12ミリ秒位が一般的です。サーバ用の高速なものになると4ミリ秒程度のドライブも存在します。 - 回転待ち時間
ハードディスクの回転スピードは一般のPC用だと7200~5400rpm、
サーバ用では10000~7200rpm位になります。サーバ用の特別に速いものでは15000rpmという回転スピードのものがあります。車のタコメータでもおなじみのrpmという単位はRevolutions Par Minuteの意味で、 1分間あたりのディスクの回転数を表します。 7200rpmの回転数は1分間に7200回転という意味になり、
1秒間に直すと120回に相当し、 ヘルツで表記では120Hz (西日本の交流電源が60Hzなのでちょうど倍) となります。1回転に要する時間は8. 33ミリ秒になります。 ハードディスク表面にある目的のデータのある場所は、
ヘッドに対して回転しているのでいつでもすぐに読み書きできるわけではありません。読み書きのためにはヘッドのちょうど真下の位置に目的のデータのある場所がやってこなければなりません。平均すると、 1回転に要する時間の半分でヘッドの真下にディスクの目的の位置がやってくることになるので、 先の7200rpmのディスクの場合には平均回転待ち時間は4. 16ミリ秒となります。 - 実際のデータを読み書きする時間
実際のディスクの読み書きの時間はデータ量が少なければ短く、
データ量が多くなります。昔のドライブは1トラックあたりのセクタ数と、 トラック数がハードディスクのスペックシートに公表されていて、 実際の読み書きのおよその時間も計算できました。ところが、 近年のドライブは外周のトラックはセクタが多く、 内周のトラックはセクタが少ないゾーン記録方式になっている関係で、 1トラックあたりのセクタ数と、 トラック数が公表されなくなったことで、 実際の読み書きのおよその時間は実測しないとわからなくなっています。 以上の3要素の内、
時間の予測がつきやすい位置決めの時間、 ディスクの回転待ち時間を元に、 検索性能にどう関係しているかについて話しを進めます。位置決めの時間が8ミリ秒、 ディスクの回転待ち時間4ミリ秒のドライブを使用すると合計で、 12ミリ秒の時間が読み書きの直前に必要になることになります。 先ほどの、
表3によると、 1,000個のデータを格納するには19個のブロックが必要でしたが、 1ブロックの読み出しの度に12ミリ秒かかるとすると、 19個のブロックでは、 228ミリ秒 (0. 228秒) かかることになります。1万個のデータの場合には35ブロックなので420ミリ秒 (0. 420秒)、 10万個のデータでは53ブロックなので636ミリ秒 (0. 636秒) になります。つまり、 複数個のブロックに分ける方式は、 検索時にデータの読み出し前にかかる時間が大きく効いてしまうことになるのです。
現在のFINDSPOTの実装
特定のN-gramに関して、
具体的には、
この1ブロック方式ならば、
一方で、
システムの導入時や、
次回予告
今年の年末は集中して、