PerlからBerkeley DBを使う - BTree形式を使う
引き続き、しつこくBerkeley DBの話です。今回はBTree形式でのDBを作成します。BTree形式はHash形式と違って、キーがソートされているという特徴が有ります。ソートアルゴリズムはデフォルトの物が用意されていますが、自分で関数を書いて指定する事もできます。
また、BTree形式のDBで、カーソルアクセスする場合、キーの一部だけを指定する事でアクセスする機能が提供されます。指定したキー情報を、DB上に格納されているキーと前方一致で比較して対象となるレコードを特定します。そんなキーの一部一致でのアクセスパターンです。
DBへの書き込み
btree_input.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use BerkeleyDB;
# DBの作成
my $DB_name = 'berkelry.db';
unlink($DB_name);
my $db = new BerkeleyDB::Btree
-Filename =>$DB_name,
-Flags => DB_CREATE,
or die "Cannot open $DB_name: $! $BerkeleyDB::Error\n";
# 値の設定.親レコードが0001と0002の2パターンを相互に挿入します。
$db->db_put('0001', 'ash');
$db->db_put('0002', 'roova');
$db->db_put('0001:Date:01', '2010/02/25');
$db->db_put('0001:Date:02', '2010/02/20');
$db->db_put('0002:Date:01', '2010/02/26');
$db->db_put('0001:Age:01', '21');
$db->db_put('0002:Age:01', '20');
# DBのクローズ
undef $db;
DBからの読み込み
btree_output.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use BerkeleyDB;
# DBの準備
my $DB_name = 'berkelry.db';
my $db = new BerkeleyDB::Btree
-Filename =>$DB_name,
or die "Cannot open $DB_name: $! $BerkeleyDB::Error\n";
# キーの一部指定でアクセス
my $key_origin = "0001";
my ($key, $value) = ($key_origin, "") ;
my $cursor = $db->db_cursor() ;
$cursor->c_get($key, $value, DB_SET_RANGE);
print "$key -> $value\n";
while($cursor->c_get($key, $value, DB_NEXT) == 0) {
last unless ($key =~ /^$key_origin/);
print "$key -> $value\n";
}
# クローズ
undef $cursor ;
undef $db;
実行結果
$ perl btree_output.pl
0001 -> ash
0001:Age:01 -> 21
0001:Date:01 -> 2010/02/25
0001:Date:02 -> 2010/02/20
関連する記録のキーを前方一致で揃えておくとカーソルアクセスで、高速にまとめて取得できます、という例です。なんだかTree型データベースみたいですね(イマドキ使われる事は無いと思いますが)。


