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

Posted

技术标签:

【中文标题】在 Berkeley DB 中通过 python 使用整数键(使用 bsddb3)【英文标题】:Use integer keys in Berkeley DB with python (using bsddb3) 【发布时间】:2013-09-06 19:11:54 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

嗯,没有解决方法。但是你可以使用两种方法

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

    使用 cPickle/pickle 模块来存储和检索数据。如果您有基本类型以外的数据类型,这是一个好方法。对于基本的ints 和floats,这实际上比存储字符串更慢并且占用更多空间

【讨论】:

以上是关于在 Berkeley DB 中通过 python 使用整数键(使用 bsddb3)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中通过语音来读取状态的全名?

在 Python 3.3 中打开 Berkeley 1.85 DB 文件

在 python 的 berkeley db 中表达多列?

我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?

berkeley db java edition怎样存储数据库?

[转] berkeley db aosa阅读