- 论坛徽章:
- 0
|
下载地址:http://www.hi-php.com/hdb-0.1.zip (内带测试程序及说明)
PHP4代码版HDB - (HashTreeDB.class.php)
-----------------------------------------------------------------------
作者: 马明练(hightman) (MSN: MingL_Mar@msn.com) (php-QQ群: 17708754)
网站: http://www.hi-php.com
时间: 2007/05/01 (update: 2007/05/08)
版本: 0.1
目的: 取代 cdb/gdbm 快速存取分词词典, 因大部分用户缺少这些基础配件和知识
功能:
这是一个类似于 cdb/gdbm 的 PHP 代码级数据类库, 通过 key, value 的方
式存取数据, 使用非常简单.
适用于快速根据唯一主键查找数据
效能:
1. 效率高(20万记录以上比php内建的cdb还要快), 经过优化后 35万记录时
树的最大深度为5, 查找效率高,单个文件
2. 文件小(缺省设置下, 基础数据约 100KB, 之后每条记录为 key, value的
总长度+13bytes
3. 无系统依赖, 跨操作系统, 不受 little endian 和 big endian 影响
4. PHP 代码级, 修改维护方便
5. 提供内建二叉树优化函数, 提供存取结构图绘制接口, 提供遍历接口
6. 数据可快速更新, 而 cdb 是只读的或只写的
缺点:
1. 对于unique key来说, 一经增加不可清除 (可以将value设为空值)
2. 当更新 value 时, 如果新 value 较长则旧的记录直接作废, 长期修改
可能会导致文件有一些无用的膨胀, 这类情况可以调用遍历接口完全重
建整个数据库
3. 由于是 php 代码级的引擎, 性能上比 gdbm 没有什么优势
4. IO操作, 可以考虑将数据文件放到 memfs 上 (linux/bsd)
5. key 最大长度为 240bytes, value 最大长度为 65279 bytes, 整个文件最大为 4G
6. 不可排序和随机分页读取
用法: (主要的方法)
1. 建立类操作句柄, 构造函数: HashTreeDB([int mask [, int base ]])
可选参数(仅针对新建数据有效): mask, base 均为整型数, 其中
mask 是 hash 求模的基数, 建议选一个质数, 大约为总记录数的 1/10 即可.
base 是 hash 数据计算的基数, 建议使用默认值. ``h = ((h << 5) + h) ^ c''
$HDB = new HashTreeDB;
2. 打开数据文件, Bool Open(string fpath [, string mode])
必要参数 fpath 为数据文件的路径, 可选参数 mode 的值为 r 或 w, 分别表示只
读或读写方式打开数据库. 成功返回 true, 失败返回 false.
缺省情况下是以只读方式打开, 即 mode 的缺省值为 'r'
$HDB->Open('/path/to/dict.hdb');
或以读写方式打开(新建数据时必须), mode 值为 'w', 此时数据库可读可写
$HDB->Open('/path/to/dict.hdb', 'w');
3. 根据 key 读取数据 mixed Get(string key [, bool verbose])
成功查找到 key 所对应的数据时返回数据内容, 类型为 string
当 key 不存在于数据库中时或产生错误直接返回 false
(*注* 当 verbose 被设为 true 时, 则返回一个完整的记录数组, 含 key&value, 仅用于调试目的)
$value = $HDB->Get($key);
或
$debug = $HDB->Get($key, true); print_r($debug);
4. 存入数据 bool Put(string key [, string value])
成功返回 true, 失败或出错返回 false , 必须以读写方式打开才可调用
注意存入的数据目前只支持 string 类型, 有特殊需要可以使用 php 内建的 serialize 将 array 转换
成 string 取出时再用 unserialize() 还原
$result = $HDB->Put($key, $value);
5. 关闭数据库, void Close()
$HDB->Close();
6. 查询文件版本号, string Version()
返回类似 HDB/0.1 之类的格式, 是当前文件的版本号
7. 记录遍历, mixed Next()
返回一条记录key, value 组成的数组, 并将内部指针往后移一位, 可调用 Reset() 重置指针
当没有记录时会返回 false, 典型应用如下
$HDB->Reset();
while ($tmp = $HDB->Next())
{
echo "$tmp[key] => $tmp[value]\n";
}
也可用于导出数据库重建新的数据库, 以清理过多的重写导致的文件空档.
8. 遍历指针复位, void Reset()
此函数仅为搭配 Next() 使用
$HDB->Reset();
9. 优化数据库, 将数据库中的 btree 转换成完全二叉树. void Optimize([int index])
由于数据库针对 key 进行 hash 分散到 mask 颗二叉树中, 故这里的 index 为 0~[mask-1]
缺省情况下 index 值为 -1 会优化整个数据库, 必须以读写方式打开的数据库才能用该方法
$HDB->Optimize();
10. 打印分析树, 绘出存贮结构的树状图, void Draw([int index])
参数 index 同 Optimize() 的参数, 本函数无返回值, 直接将结果 echo 出来, 仅用于调试和观看
分析
$HDB->Draw(0);
$HDB->Draw(1);
... |
|