侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

btree函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 32 阅读 / 1,519 字 / 正在检测是否收录...

btree函数用法详解

btree函数简介

  • 头文件包含

  • 函数定义

btree函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘btree’ [-Wimplicit-function-declaration]
    解决办法:包含头文件

btree函数详细描述

"Note well" :此页面记录glibc提供的接口直到2.1版。从2.2版开始,glibc不再提供这些接口。您可能正在寻找libdb库提供的API。
例程dbopen (3)是数据库文件的库接口。支持的文件格式之一是btree文件。数据库访问方法的一般描述在dbopen (3)中,此手册页只描述了特定于BTree的信息。
btree数据结构是存储相关键/数据对的排序、平衡的树结构。
提供给dbopen (3)的特定于btree访问方法的数据结构在 include文件中定义如下:

typedef struct {
   unsigned long flags;
   unsigned int  cachesize;
   int           maxkeypage;
   int           minkeypage;
   unsigned int  psize;
   int         (*compare)(const DBT *key1, const DBT *key2);
   size_t      (*prefix)(const DBT *key1, const DBT *key2);
   int           lorder;
} BTREEINFO;

这一结构的要素如下:

  • flags标志值通过ORing以下任何值来指定:.rs
  • R_DUP 允许树中的重复键,也就是说,如果要插入的键已经存在于树中,则允许插入。如dbopen (3)中所述,默认行为是在插入新键时覆盖匹配键,或者在指定了 R_NOOVERWRITE 标志时失败。 R_DUP 标志被 R_NOOVERWRITE 标志重写,如果指定了 R_NOOVERWRITE 标志,将重复键插入树的尝试将失败。.ip如果数据库包含重复密钥,则使用get例程时,密钥/数据对的检索顺序是未定义的,然而,设置了 R_CURSOR 标志的seq例程调用将始终返回任何一组重复密钥的逻辑“第一个”。.Re
  • cachesize内存缓存的建议最大大小(以字节为单位)。这个值是only advision,访问方法将分配更多内存而不是失败。由于每次搜索都会检查树的根页,所以缓存最近使用的页大大提高了访问时间。此外,物理写入会尽可能长时间地延迟,因此适度的缓存可以显著减少I/O操作的数量。显然,如果在修改树时系统崩溃,使用缓存会增加(但只会增加)损坏或丢失数据的可能性。如果cachesize为0(未指定大小),则使用默认缓存。
  • maxkeypage将存储在任何单个页面上的最大键数。当前未实现。
  • minkeypage将存储在任何单个页面上的最小键数。此值用于确定哪些键将存储在溢出页上,也就是说,如果键或数据项的长度大于pagesize除以minkeypage值,则它将存储在溢出页上,而不是页本身中。如果minkeypage为0(未指定最小键数),则使用值2。
  • psize页大小是用于树中节点的页的大小(以字节为单位)。最小页大小为512字节,最大页大小为64\kib。如果psize为0(未指定页面大小),则根据底层文件系统I/O块大小选择页面大小。
  • compare比较是关键的比较功能。如果认为第一个键参数分别小于、等于或大于第二个键参数,则必须返回一个小于、等于或大于零的整数。每次打开给定树时必须对其使用相同的比较函数。如果compare为NULL(未指定比较函数),则对键进行词法比较,较短的键被认为小于较长的键。
  • prefix前缀是前缀比较函数。如果指定,此例程必须返回第二个键参数的字节数,这是确定第二个键参数大于第一个键参数所必需的字节数。如果密钥相等,则应返回密钥长度。注意,这个例程的有用性非常依赖于数据,但是,在某些数据集中,可以显著减少树的大小和搜索时间。如果prefix为NULL(未指定前缀函数),and未指定比较函数,则使用默认的词法比较例程。如果prefix为NULL并且指定了比较例程,则不执行前缀比较。
  • lorder存储的数据库元数据中整数的字节顺序。数字应该以整数的形式表示顺序;例如,big endian order将是数字4321。如果lorder为0(未指定顺序),则使用当前主机顺序。

如果文件已经存在(并且未指定 O_TRUNC 标志),则忽略为参数flags 、lorder 和psize指定的值,而忽略创建树时使用的值。
树的前向顺序扫描是从最小的键到最大的键。
通过从树中删除键/数据对而释放的空间永远不会被回收,尽管它通常可用于重用。这意味着btree存储结构是只生长的。唯一的解决方案是避免过多的删除,或者从扫描现有的树中周期性地创建新的树。
btree中的搜索、插入和删除都将在O lg base N中完成,其中base是平均填充因子。通常,将有序数据插入btrees会导致填充因子较低。这个实现已经被修改,以使有序插入成为最佳情况,结果是比普通的页面填充因子好得多。

btree函数错误码

btree访问方法例程可能失败,并为库例程dbopen (3)指定的任何错误设置errno

0

评论区