首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python3在磁盘上的B+树:Bplustree

Bplustree

Python3在磁盘上的B+树。

它就像一个字典,但存储在磁盘上。那么什么时候使用它呢?

要存储的数据不适合存在内存里时

数据需要被持久化时

键的顺序很重要时

此项目正在开发中,不同版本的文件格式会有所不同;因此,该数据不要用作您主要的数据来源。

快速开始

用pip安装Bplustree:

创建存储在文件中的B+树索引,并按如下方式使用它:

键和值

键必须具有自然顺序,并且必须可序列化成字节;其中提供了最常见类型的一些默认序列化程序,例如,索引UUID:

另一方面,值总是字节。它们可以是任意长度的,参数value_size=128定义了在树本身中可以存储的值的大小上限。超出此限制的值将存储在溢出页面中,每个溢出值至少占满一页。

迭代

由于键有顺序,所以按顺序检索元素是非常有效的:

也可以通过给出Python片段遍历树的子集:

两种方法都使用一个生成器,所以它们不需要将整个内容加载到内存中,而是将树的一部分复制到字典中也是可以的:

并发性

树是线程安全的,它支持多用户读取/单用户写入。

如下是安全的:

在多个线程之间共享一个BPlusTree实例。

如下是不安全的:

在多个进程之间的共享一个BPlusTree实例。

创建指向同一文件的多个BPlusTree实例。

持久化

预写日志(WAL)用于确保数据安全。对树所做的所有更改都附加到WAL中,通常在关闭树时,仅在检查点的操作中才会合并到树中。这种方法来自于其他数据库的启发,例如SQLite。

如果树没有正确关闭(停电,进程停止...),WAL文件会在下一次树被打开时合并。

性能

像任何数据库一样,有许多方法可以微调引擎并获得最佳性能:

order或分支因子,定义每个节点将容纳多少条目;

page_size是分配给一个节点的字节数量和读写操作的长度,最好保持接近磁盘的块大小;

cache_size保持频繁使用的节点,大缓存防止了从原始页面创建Python对象的昂贵操作,但是使用了更多的内存。

有效使用树的一些建议:

如果可能的话,按照升序插入元素,首选UUID v1到UUID v4;

使用tree.batch_insert(iterator)批量插入,而不是循环使用tree.insert();

迭代使用树,而不是在循环中使用tree.get();

如果插入很多使用tree.checkpoint(),这将防止WAL无限增长;

使用小键和值,相应地设置其限制和溢出值;

将文件和WAL存储在快速磁盘上;

许可证

MIT

英文原文:https://github.com/NicolasLM/bplustree

译者:掌心化雪

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180130A05PDZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券