~tokyocabinet/tokyocabinet/jmansion-1.3.22-win32port

« back to all changes in this revision

Viewing changes to doc/spex-ja.html

  • Committer: Baptiste Lepilleur
  • Date: 2009-07-30 19:18:20 UTC
  • Revision ID: blep@users.sourceforge.net-20090730191820-39v7rhqpb68x5bpc
Tags: tokyocabinet-1.3.20
release 1.3.20

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
 
55
55
<p>ハッシュ表のデータベースでは、キーはデータベース内で一意であり、キーが重複する複数のレコードを格納することはできません。このデータベースに対しては、キーと値を指定してレコードを格納したり、キーを指定して対応するレコードを削除したり、キーを指定して対応するレコードを検索したりすることができます。また、データベースに格納してある全てのキーを順不同に一つずつ取り出すこともできます。このような操作は、UNIX標準で定義されているDBMライブラリおよびその追従であるNDBMやGDBMに類するものです。Tokyo CabinetはDBMのより良い代替として利用することができます。</p>
56
56
 
57
 
<p>B+木のデータベースでは、キーが重複する複数のレコードを格納することができます。このデータベースに対しては、ハッシュ表のデータベースと同様に、キーを指定してレコードを格納したり取り出したり削除したりすることができます。レコードはユーザが指示した比較関数に基づいて整列されて格納されます。カーソルを用いて各レコードを昇順または降順で参照することができます。この機構によって、文字列の前方一致検索や数値の範囲検索が可能になります。また、B+木のデータベースではトランザクションが利用できます。</p>
 
57
<p>B+木のデータベースでは、キーが重複する複数のレコードを格納することができます。このデータベースに対しては、ハッシュ表のデータベースと同様に、キーを指定してレコードを格納したり取り出したり削除したりすることができます。レコードはユーザが指示した比較関数に基づいて整列されて格納されます。カーソルを用いて各レコードを昇順または降順で参照することができます。この機構によって、文字列の前方一致検索や数値の範囲検索が可能になります。</p>
58
58
 
59
59
<p>固定長配列のデータベースでは、一意な自然数をキーとしてレコードが格納されます。キーが重複する複数のレコードを格納することはできません。また、各レコードの値の長さは一定以下に制限されます。提供される操作はハッシュデータベースとほぼ同様です。</p>
60
60
 
101
101
 
102
102
<p>B+木データベースは上述のハッシュデータベースを基盤として実装されます。B+木の各ページはハッシュデータベースのレコードとして記録されるので、ハッシュデータベースの記憶管理の効率性を継承しています。B+木では各レコードのヘッダが小さく、アラインメントはページの単位でとられるので、ほとんどの場合、ハッシュデータベースに較べてデータベースファイルのサイズが半減します。B+木を更新する際には多くのページを操作する必要がありますが、Tokyo Cabinetはページをキャッシュすることによってファイル操作を減らして処理を効率化します。ほとんどの場合、疎インデックス全体がメモリ上にキャッシュされるので、各レコードを参照するのに必要なファイル操作は平均1パス以下です。</p>
103
103
 
104
 
<p>B+木データベースはトランザクション機構を提供します。トランザクションを開始してから終了するまでの一連の操作を一括してデータベースにコミットしたり、一連の更新操作を破棄してデータベースの状態をトランザクションの開始前の状態にロールバックしたりすることができます。トランザクションの分離レベルは2種類あります。データベースに対する全ての操作をトランザクション内で行うと直列化可能(serializable)トランザクションとなり、トランザクション外の操作を同時に行うと非コミット読み取り(read uncommitted)トランザクションとなります。</p>
105
 
 
106
104
<p>各ページを圧縮して保存する機能も提供されます。圧縮方式はZLIBのDeflateとBZIP2のブロックソーティングの2種類をサポートしています。同一ページ内の各レコードは似たようなパターンを持つため、Lempel-ZivやBWTなどのアルゴリズムを適用すると高い圧縮効率が期待できます。テキストデータを扱う場合、データベースのサイズが元の25%程度になります。データベースの規模が大きくディスクI/Oがボトルネックとなる場合は、圧縮機能を有効化すると処理速度が大幅に改善されます。</p>
107
105
 
108
106
<h3>素朴な固定長データベースの実装</h3>
113
111
 
114
112
<p>データベースのサイズは、キーの変域と値の制限長に比例します。すなわち、キーの変域が小さく、値のサイズが小さいほど、空間効率は向上します。例えば、キーの最大値が100万で、値の制限長が100バイトの場合、データベースのサイズは100MBほどになります。RAM上に読み込まれるのは実際に参照されたレコードの周辺の領域のみなので、データベースのサイズは仮想メモリのサイズまで大きくすることができます。</p>
115
113
 
 
114
<h3>実用的な機能性</h3>
 
115
 
 
116
<p>ハッシュデータベースとB+木データベースはトランザクション機構を提供します。トランザクションを開始してから終了するまでの一連の操作を一括してデータベースにコミットしたり、一連の更新操作を破棄してデータベースの状態をトランザクションの開始前の状態にロールバックしたりすることができます。トランザクションの分離レベルは2種類あります。データベースに対する全ての操作をトランザクション内で行うと直列化可能(serializable)トランザクションとなり、トランザクション外の操作を同時に行うと非コミット読み取り(read uncommitted)トランザクションとなります。耐久性はログ先行書き込みとシャドウページングによって担保されます。</p>
 
117
 
 
118
<p>Tokyo Cabinetにはデータベースに接続するモードとして、「リーダ」と「ライタ」の二種類があります。リーダは読み込み専用で、ライタは読み書き両用です。データベースにはファイルロックによってプロセス間での排他制御が行われます。ライタが接続している間は、他のプロセスはリーダとしてもライタとしても接続できません。リーダが接続している間は、他のプロセスのリーダは接続できるが、ライタは接続できません。この機構によって、マルチタスク環境での同時接続に伴うデータの整合性が保証されます。</p>
 
119
 
 
120
<p>Tokyo CabinetのAPIの各関数はリエントラントであり、マルチスレッド環境で安全に利用することができます。別個のデータベースオブジェクトに対しては全ての操作を完全に並列に行うことができます。同一のデータベースオブジェクトに対しては、リードライトロックで排他制御を行います。すなわち、読み込みを行うスレッド同士は並列に実行でき、書き込みを行うスレッドは他の読み込みや書き込みをブロックします。</p>
 
121
 
116
122
<h3>単純だが多様なインタフェース群</h3>
117
123
 
118
124
<p>Tokyo Cabinetはオブジェクト指向に基づいた簡潔なAPIを提供します。データベースに対する全ての操作はデータベースオブジェクトにカプセル化され、開く(open)、閉じる(close)、挿入する(put)、削除する(out)、取得する(get)といった関数(メソッド)を呼ぶことでプログラミングを進めていけます。ハッシュデータベースとB+木データベースと固定長データベースのAPIは互いに酷似しているので、アプリケーションを一方から他方に移植することも簡単です。</p>
119
125
 
120
 
<p>Tokyo Cabinetにはデータベースに接続するモードとして、「リーダ」と「ライタ」の二種類があります。リーダは読み込み専用で、ライタは読み書き両用です。データベースにはファイルロックによってプロセス間での排他制御が行われます。ライタが接続している間は、他のプロセスはリーダとしてもライタとしても接続できません。リーダが接続している間は、他のプロセスのリーダは接続できるが、ライタは接続できません。この機構によって、マルチタスク環境での同時接続に伴うデータの整合性が保証されます。</p>
121
 
 
122
 
<p>Tokyo CabinetのAPIの各関数はリエントラントであり、マルチスレッド環境で安全に利用することができます。別個のデータベースオブジェクトに対しては全ての操作を完全に並列に行うことができます。同一のデータベースオブジェクトに対しては、リードライトロックで排他制御を行います。すなわち、読み込みを行うスレッド同士は並列に実行でき、書き込みを行うスレッドは他の読み込みや書き込みをブロックします。</p>
123
 
 
124
126
<p>メモリ上でレコードを簡単に扱うために、ユーティリティAPIが提供されます。リストやマップといった基本的なデータ構造をはじめ、メモリプールや文字列処理や符号処理など、プログラミングで良く使う機能を詰め込んでいます。</p>
125
127
 
126
128
<p>C言語のAPIには、ユーティリティAPI、ハッシュデータベースAPI、B+木データベースAPI、固定長データベースAPI、抽象データベースAPIの5種類があります。各APIに対応したコマンドラインインタフェースも用意されています。それらはプロトタイピングやテストやデバッグなどで活躍するでしょう。Tokyo CabinetはC言語の他にも、PerlとRubyとJavaとLuaのAPIを提供します。Perl用APIはXS言語を用いてハッシュデータベースAPIとB+木データベースAPIと固定長データベースAPIを呼び出すものです。Ruby用APIはRubyのモジュールとしてハッシュデータベースAPIとB+木データベースAPIと固定長データベースAPIを呼び出すものです。Java用APIはJava Native Interfaceを用いてハッシュデータベースAPIとB+木データベースAPIと固定長データベースAPIを呼び出すものです。Lua用APIはLuaのモジュールとしてハッシュデータベースAPIとB+木データベースAPIと固定長データベースAPIを呼び出すものです。その他の言語のインターフェイスも第三者によって提供されるでしょう。</p>
185
187
/usr/local/include/tcfdb.h
186
188
/usr/local/include/tcadb.h
187
189
/usr/local/lib/libtokyocabinet.a
188
 
/usr/local/lib/libtokyocabinet.so.5.14.0
 
190
/usr/local/lib/libtokyocabinet.so.5.15.0
189
191
/usr/local/lib/libtokyocabinet.so.5
190
192
/usr/local/lib/libtokyocabinet.so
191
193
/usr/local/lib/pkgconfig/tokyocabinet.pc
3224
3226
<dt><code>bool tchdbopen(TCHDB *<var>hdb</var>, const char *<var>path</var>, int <var>omode</var>);</code></dt>
3225
3227
<dd>`<var>hdb</var>' specifies the hash database object which is not opened.</dd>
3226
3228
<dd>`<var>path</var>' specifies the path of the database file.</dd>
3227
 
<dd>`<var>omode</var>' specifies the connection mode: `HDBOWRITER' as a writer, `HDBOREADER' as a reader.  If the mode is `HDBOWRITER', the following may be added by bitwise or: `HDBOCREAT', which means it creates a new database if not exist, `HDBOTRUNC', which means it creates a new database regardless if one exists.  Both of `HDBOREADER' and `HDBOWRITER' can be added to by bitwise or: `HDBONOLCK', which means it opens the database file without file locking, or `HDBOLCKNB', which means locking is performed without blocking.</dd>
 
3229
<dd>`<var>omode</var>' specifies the connection mode: `HDBOWRITER' as a writer, `HDBOREADER' as a reader.  If the mode is `HDBOWRITER', the following may be added by bitwise or: `HDBOCREAT', which means it creates a new database if not exist, `HDBOTRUNC', which means it creates a new database regardless if one exists, `HDBOTSYNC', which means every transaction synchronizes updated contents with the device.  Both of `HDBOREADER' and `HDBOWRITER' can be added to by bitwise or: `HDBONOLCK', which means it opens the database file without file locking, or `HDBOLCKNB', which means locking is performed without blocking.</dd>
3228
3230
<dd>If successful, the return value is true, else, it is false.</dd>
3229
3231
</dl>
3230
3232
 
3531
3533
<dd>The database file is assured to be kept synchronized and not modified while the copying or executing operation is in progress.  So, this function is useful to create a backup file of the database file.</dd>
3532
3534
</dl>
3533
3535
 
 
3536
<p>The function `tchdbtranbegin' is used in order to begin the transaction of a hash database object.</p>
 
3537
 
 
3538
<dl class="api">
 
3539
<dt><code>bool tchdbtranbegin(TCHDB *<var>hdb</var>);</code></dt>
 
3540
<dd>`<var>hdb</var>' specifies the hash database object connected as a writer.</dd>
 
3541
<dd>If successful, the return value is true, else, it is false.</dd>
 
3542
<dd>The database is locked by the thread while the transaction so that only one transaction can be activated with a database object at the same time.  Thus, the serializable isolation level is assumed if every database operation is performed in the transaction.  All updated regions are kept track of by write ahead logging while the transaction.  If the database is closed during transaction, the transaction is aborted implicitly.</dd>
 
3543
</dl>
 
3544
 
 
3545
<p>The function `tchdbtrancommit' is used in order to commit the transaction of a hash database object.</p>
 
3546
 
 
3547
<dl class="api">
 
3548
<dt><code>bool tchdbtrancommit(TCHDB *<var>hdb</var>);</code></dt>
 
3549
<dd>`<var>hdb</var>' specifies the hash database object connected as a writer.</dd>
 
3550
<dd>If successful, the return value is true, else, it is false.</dd>
 
3551
<dd>Update in the transaction is fixed when it is committed successfully.</dd>
 
3552
</dl>
 
3553
 
 
3554
<p>The function `tchdbtranabort' is used in order to abort the transaction of a hash database object.</p>
 
3555
 
 
3556
<dl class="api">
 
3557
<dt><code>bool tchdbtranabort(TCHDB *<var>hdb</var>);</code></dt>
 
3558
<dd>`<var>hdb</var>' specifies the hash database object connected as a writer.</dd>
 
3559
<dd>If successful, the return value is true, else, it is false.</dd>
 
3560
<dd>Update in the transaction is discarded when it is aborted.  The state of the database is rollbacked to before transaction.</dd>
 
3561
</dl>
 
3562
 
3534
3563
<p>The function `tchdbpath' is used in order to get the file path of a hash database object.</p>
3535
3564
 
3536
3565
<dl class="api">
3868
3897
<dt><code>bool tcbdbopen(TCBDB *<var>bdb</var>, const char *<var>path</var>, int <var>omode</var>);</code></dt>
3869
3898
<dd>`<var>bdb</var>' specifies the B+ tree database object which is not opened.</dd>
3870
3899
<dd>`<var>path</var>' specifies the path of the database file.</dd>
3871
 
<dd>`<var>omode</var>' specifies the connection mode: `BDBOWRITER' as a writer, `BDBOREADER' as a reader.  If the mode is `BDBOWRITER', the following may be added by bitwise or: `BDBOCREAT', which means it creates a new database if not exist, `BDBOTRUNC', which means it creates a new database regardless if one exists.  Both of `BDBOREADER' and `BDBOWRITER' can be added to by bitwise or: `BDBONOLCK', which means it opens the database file without file locking, or `BDBOLCKNB', which means locking is performed without blocking.</dd>
 
3900
<dd>`<var>omode</var>' specifies the connection mode: `BDBOWRITER' as a writer, `BDBOREADER' as a reader.  If the mode is `BDBOWRITER', the following may be added by bitwise or: `BDBOCREAT', which means it creates a new database if not exist, `BDBOTRUNC', which means it creates a new database regardless if one exists, `BDBOTSYNC', which means every transaction synchronizes updated contents with the device.  Both of `BDBOREADER' and `BDBOWRITER' can be added to by bitwise or: `BDBONOLCK', which means it opens the database file without file locking, or `BDBOLCKNB', which means locking is performed without blocking.</dd>
3872
3901
<dd>If successful, the return value is true, else, it is false.</dd>
3873
3902
</dl>
3874
3903
 
5685
5714
 
5686
5715
<p>抽象データベースAPIを簡単に利用するために、コマンドラインインターフェイスとして `<code>tcatest</code>' と `<code>tcamgr</code>' が提供されます。</p>
5687
5716
 
5688
 
<p>コマンド `<code>tcatest</code>' は、抽象データベースAPIの機能テストや性能テストに用いるツールです。以下の書式で用います。`<var>name</var>' はデータベースの名前を指定し、`<var>rnum</var>' は試行回数を指定します。</p>
 
5717
<p>コマンド `<code>tcatest</code>' は、抽象データベースAPIの機能テストや性能テストに用いるツールです。以下の書式で用います。`<var>name</var>' はデータベースの名前を指定し、`<var>rnum</var>' は試行回数を指定し、`<var>tnum</var>' はトランザクションの回数を指定します。</p>
5689
5718
 
5690
5719
<dl class="api">
5691
5720
<dt><code>tcatest write <var>name</var> <var>rnum</var></code></dt>
5700
5729
<dd>各種操作の組み合わせテストを行う。</dd>
5701
5730
<dt><code>tcatest wicked <var>name</var> <var>rnum</var></code></dt>
5702
5731
<dd>各種更新操作を無作為に選択して実行する。</dd>
 
5732
<dt><code>tcatest compare <var>name</var> <var>tnum</var> <var>rnum</var></code></dt>
 
5733
<dd>各種データベースの比較テストを行う。</dd>
5703
5734
</dl>
5704
5735
 
5705
5736
<p>このコマンドは処理が正常に終了すれば 0 を返し、エラーがあればそれ以外の値を返して終了します。</p>
5840
5871
 
5841
5872
<h3>トランザクション</h3>
5842
5873
 
5843
 
<p>B+木データベースにはトランザクション機構があります。トランザクションを開始してから行った一連の操作は、コミットすることで確定させたり、アボートすることでなかったことにしたりすることができます。トランザクション中にアプリケーションがクラッシュ場合にも、トランザクション中の操作がなかったことになるだけで、データベースの整合性は維持されます。トランザクションは以下のようなコードで用います。</p>
 
5874
<p>ハッシュデータベースとB+木データベースにはトランザクション機構があります。トランザクションを開始してから行った一連の操作は、コミットすることで確定させたり、アボートすることでなかったことにしたりすることができます。トランザクション中にアプリケーションがクラッシュ場合にも、トランザクション中の操作がなかったことになるだけで、データベースの整合性は維持されます。トランザクションは以下のようなコードで用います。</p>
5844
5875
 
5845
 
<pre>tcbdbtranbegin(hdb);
 
5876
<pre>tchdbtranbegin(hdb);
5846
5877
do_something();
5847
5878
if(is_all_ok){
5848
 
  tcbdbtrancommit(hdb);
 
5879
  tchdbtrancommit(hdb);
5849
5880
} else {
5850
 
  tcbdbtranabort(hdb);
 
5881
  tchdbtranabort(hdb);
5851
5882
}
5852
5883
</pre>
5853
5884
 
5854
5885
<p>トランザクションを実行できるのは同時1スレッドのみで、他のスレッドはその間ブロックされます。したがって、データベースの参照をトランザクション内でのみ行うならば、トランザクションの分離レベルは直列化可能(serializable)になります。しかし、あるスレッドがトランザクションの最中でも他のスレッドはトランザクションを実行せずにデータベースを参照できます。その場合の分離レベルは非コミット読み取り(read uncommitted)になります。状況に応じて使い分けてください。</p>
5855
5886
 
 
5887
<p>トランザクション機構は、ハッシュデータベースではファイル上のログ先行書き込み(write ahead logging)によって実現され、B+木データベースではメモリ上のシャドウページング(shadow paging)によって実現されます。これらの手法とロックによって、データベース単位のACID属性(atomicity、consistency、isolation、durability)が確保されます。</p>
 
5888
 
 
5889
<p>ファイルシステムのdurabilityすらも信用しない場合(突然の電源切断に耐える確率を上げたい場合)には、データベースを開く際に `<code>HDBOTSYNC</code>' または `<code>BDBOTSYNC</code>' オプションをつけてください。そうすると、すべてのトランザクションの前後にfsyncで更新内容とディスクの内容の同期がとられるようになります(めちゃくちゃ遅くなりますが)。とはいえ、いかにトランザクションを使ってもディスクが壊れたらオシマイなので、重要なデータベースに関してはバックアップや冗長化の手法を適用してください。</p>
 
5890
 
5856
5891
<h3>カーソル</h3>
5857
5892
 
5858
5893
<p>B+木データベースにはカーソル機構があります。カーソルは指定したキーの場所にジャンプさせることができ、そこから前後にひとつずつずらしながらレコードを参照したり更新したりすることができます。例えば文字列の前方一致検索を行う場合、接頭辞をキーとして指定してカーソルをジャンプさせて、そこから前に進みながらキーを一つ一つ参照していって、前方一致しなかった時点で止めるという処理になります。例えば "tokyo" で始まるキーのレコードを取り出すには以下のようなコードになるでしょう。</p>
6106
6141
</tr>
6107
6142
</table>
6108
6143
 
 
6144
<p>トランザクションログはデータベース名に ".wal" を後置した名前のファイルとして記録されます。ファイルの先頭8バイトにトランザクション開始時のデータベースファイルのサイズを記録し、その後に更新操作による差分情報を持つ以下の要素を連結します。</p>
 
6145
 
 
6146
<table summary="transaction log format">
 
6147
<tr>
 
6148
<td class="label">名前</td>
 
6149
<td class="label">オフセット</td>
 
6150
<td class="label">データ長</td>
 
6151
<td class="label">機能</td>
 
6152
</tr>
 
6153
<tr>
 
6154
<td>オフセット</td>
 
6155
<td class="number">0</td>
 
6156
<td class="number">8</td>
 
6157
<td>更新された領域の先頭のオフセット</td>
 
6158
</tr>
 
6159
<tr>
 
6160
<td>サイズ</td>
 
6161
<td class="number">8</td>
 
6162
<td class="number">4</td>
 
6163
<td>更新された領域のサイズ</td>
 
6164
</tr>
 
6165
<tr>
 
6166
<td>データ</td>
 
6167
<td class="number">12</td>
 
6168
<td class="number">可変</td>
 
6169
<td>更新される領域の更新前のデータ</td>
 
6170
</tr>
 
6171
</table>
 
6172
 
6109
6173
<h3>B+木データベースのファイルフォーマット</h3>
6110
6174
 
6111
6175
<p>B+木データベースが扱う全てのデータはハッシュデータベースに記録されます。記録されるデータは、メタデータと論理ページに分類されます。論理ページはリーフノードと非リーフノードに分類されます。固定長数値と可変長数値の形式はハッシューデータベースと同じです。</p>
6448
6512
<dt>Q. : Tokyo CabinetはSQLをサポートしますか?</dt>
6449
6513
<dd>A. : Tokyo CabinetはSQLをサポートしません。Tokyo CabinetはRDBMS(関係データベース管理システム)ではありません。組み込みのRDBMSを求めるなら、SQLiteなどを利用するとよいでしょう。</dd>
6450
6514
<dt>Q. : Berkeley DBとどう違うのですか?</dt>
6451
 
<dd>A. : 時間効率と空間効率の双方でTokyo Cabinetが優っています。トランザクションの機能と耐障害性についてはBerkeley DBの方が優っています。</dd>
 
6515
<dd>A. : 時間効率と空間効率の双方でTokyo Cabinetが優っています。</dd>
6452
6516
<dt>Q. : アプリケーションの良いサンプルコードはありますか?</dt>
6453
6517
<dd>A. : 各APIのコマンドのソースコードを参考にしてください。`<code>tchmgr.c</code>' と `<code>tcbmgr.c</code>' が最も簡潔でしょう。</dd>
6454
6518
<dt>Q. : データベースが壊れたのですが、どうしてでしょうか?。</dt>
6455
6519
<dd>A. : 大抵の場合、あなたのアプリケーションがきちんとデータベースを閉じていないのが原因です。デーモンプロセスであろうが、CGIスクリプトであろうが、アプリケーションが終了する際には必ずデータベースを閉じなければなりません。なお、CGIのプロセスはSIGPIPEやSIGTERMによって殺されることがあることにも留意しましょう。</dd>
6456
6520
<dt>Q. : データベースを壊れにくくするにはどうすればよいですか?</dt>
6457
 
<dd>A. : できるならハッシュデータベースを使ってください。ハッシュデータベースはB+木データベースに比べてクラッシュに強いです。それが無理なら、B+木データベースAPIのトランザクション機能を使ってください。これもアプリケーションのクラッシュに対してある程度の耐性があります。</dd>
 
6521
<dd>A. : トランザクションを使ってください。ディスクやファイルシステムが壊れなければデータベースが壊れないようにすることができます。</dd>
6458
6522
<dt>Q. : 壊れたデータベースを修復するにはどうすればよいですか?</dt>
6459
6523
<dd>A. : データベースファイルをロックなしオプション(<code>HDBONOLCK</code>か<code>BDBONOLCK</code>)をつけて開いて、最適化機能(<code>tchdboptimize</code>か<code>tcbdboptimize</code>)を実行してください。コマンドラインで修復処理を行いたい場合、「<code>tchmgr optimize -nl casket</code>」もしくは「<code>tcbmgr optimize -nl casket</code>」を実行してください。</dd>
6460
6524
<dt>Q. : 性能を引き出すシステムの設定はどんなものがありますか?</dt>