btree
– 简单的 BTree 数据库¶
该 btree
模块使用外部存储(磁盘文件,或一般情况下,随机访问stream
)实现了一个简单的键值数据库。键按顺序存储在数据库中,除了通过键值进行高效检索外,数据库还支持高效的有序范围扫描(使用给定范围内的键检索值)。在应用程序接口方面,BTree 数据库的工作方式尽可能接近标准dict
类型的工作方式,一个显着的区别是键和值都必须是bytes
对象(因此,如果要存储其他类型的对象,则需要将它们序列化到 bytes
第一)。
该模块基于著名的 BerkelyDB 库,版本 1.xx。
示例:
import btree
# First, we need to open a stream which holds a database
# This is usually a file, but can be in-memory database
# using uio.BytesIO, a raw flash partition, etc.
# Oftentimes, you want to create a database file if it doesn't
# exist and open if it exists. Idiom below takes care of this.
# DO NOT open database with "a+b" access mode.
try:
f = open("mydb", "r+b")
except OSError:
f = open("mydb", "w+b")
# Now open a database itself
db = btree.open(f)
# The keys you add will be sorted internally in the database
db[b"3"] = b"three"
db[b"1"] = b"one"
db[b"2"] = b"two"
# Assume that any changes are cached in memory unless
# explicitly flushed (or database closed). Flush database
# at the end of each "transaction".
db.flush()
# Prints b'two'
print(db[b"2"])
# Iterate over sorted keys in the database, starting from b"2"
# until the end of the database, returning only values.
# Mind that arguments passed to values() method are *key* values.
# Prints:
# b'two'
# b'three'
for word in db.values(b"2"):
print(word)
del db[b"2"]
# No longer true, prints False
print(b"2" in db)
# Prints:
# b"1"
# b"3"
for key in db:
print(key)
db.close()
# Don't forget to close the underlying stream!
f.close()
功能¶
-
btree.
open
(stream, *, flags=0, pagesize=0, cachesize=0, minkeypage=0)¶ 从随机访问
stream
(如打开文件)打开数据库。所有其他参数都是可选的且仅限关键字,并允许调整数据库操作的高级参数(大多数用户不需要它们):标志- 当前未使用。
pagesize - 用于 BTree 中节点的页面大小。可接受的范围是 512-65536。如果为 0,将使用特定于端口的默认值,针对端口的内存使用和/或性能进行优化。
cachesize - 建议的内存缓存大小(以字节为单位)。对于具有足够内存的主板,使用较大的值可能会提高性能。缓存策略如下:不一次性分配整个缓存;相反,访问数据库中的新页面将为其分配内存缓冲区,直到达到cachesize指定的值。然后,这些缓冲区将使用 LRU(最近最少使用)策略进行管理。如果需要(例如,如果数据库包含大键和/或值),仍可以分配更多缓冲区。分配的缓存缓冲区不会被回收。
minkeypage - 每页存储的最小键数。默认值 0 相当于 2。
返回一个 BTree 对象,它实现了一个字典协议(方法集),以及下面描述的一些附加方法。
方法¶
-
btree.
close
()¶ 关闭数据库。在处理结束时必须关闭数据库,因为一些未写入的数据可能仍在缓存中。请注意,这不会关闭打开数据库的底层流,它应该单独关闭(这也是强制性的,以确保数据从缓冲区刷新到底层存储)。
-
btree.
flush
()¶ 将缓存中的任何数据刷新到底层流。
-
btree.
__getitem__
(key)¶ -
btree.
get
(key, default=None, /)¶ -
btree.
__setitem__
(key, val)¶ -
btree.
__delitem__
(key)¶ -
btree.
__contains__
(key)¶ 标准字典方法。
-
btree.
__iter__
()¶ BTree 对象可以直接迭代(类似于字典)以按顺序访问所有键。
-
btree.
keys
([start_key[, end_key[, flags]]])¶ -
btree.
values
([start_key[, end_key[, flags]]])¶ -
btree.
items
([start_key[, end_key[, flags]]])¶ 这些方法类似于标准字典方法,但也可以采用可选参数来迭代关键子范围,而不是整个数据库。请注意,对于所有 3 种方法,start_key和 end_key参数表示键值。例如,
values()
方法将迭代对应于给定键范围的值。start_key 的None 值表示“从第一个键开始”,没有 end_key或其值 None 表示“直到数据库结束”。默认情况下,范围是包容性的start_key和排他性的 end_key,您可以包括end_key通过传递迭代标志 的btree.INCL
. 您可以通过传递降序重点方向遍历标志的btree.DESC
。标志值可以被 ORed 在一起。