在 Berkeley DB 中使用整数键和 python(使用 bsddb3)



我想使用BDB作为时间序列数据存储,并计划使用自纪元以来的微秒作为键值。我正在使用 BTREE 作为数据存储类型。

但是,当我尝试存储整数键时,bsddb3 给出一个错误,说 TypeError: Integer keys only allowed for Recno and Queue DB's .

最好的解决方法是什么?我可以将它们存储为字符串,但这可能会使其不必要地变慢。

鉴于BDB本身可以处理任何类型的数据,为什么会有限制? 我可以破解 bsddb3 实现吗? 有没有人使用任何其他方法?

你不能存储整数,因为 bsddb 不知道如何表示整数以及它是哪种整数。

如果将整数转换为字符串,则会破坏 bsddb 键的字典顺序:10 > 2但作为字符串"10" < "2"

你必须使用 python 结构将整数转换为字符串(或在 python 3 中转换为字节)来存储然后将它们存储在 bsddb 中。您必须使用bigendian包装,否则订购将不正确。

然后,您可以使用 bsddb 的Cursor.set_range(key)查询给定时间段内的信息。

例如,Cursor.set_range(struct.unpack('>Q', 123456789))会将光标设置为偶数在123456789或之后发生的第一个键。

好吧,没有解决方法。但是您可以使用两种方法

  1. 使用 strrepr 将整数存储为字符串。如果整数很大,您甚至可以使用字符串格式

  2. 使用 cPickle/pickle 模块来存储和检索数据。如果您有基本类型以外的数据类型,这是一种好方法。对于 s 和 float s int的基础知识,这实际上比存储字符串更慢,占用更多空间

最新更新