在 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】:嗯,没有解决方法。但是你可以使用两种方法
使用str
或repr
将整数存储为字符串。如果整数很大,你甚至可以使用字符串格式化
使用 cPickle/pickle 模块来存储和检索数据。如果您有基本类型以外的数据类型,这是一个好方法。对于基本的int
s 和float
s,这实际上比存储字符串更慢并且占用更多空间
【讨论】:
以上是关于在 Berkeley DB 中通过 python 使用整数键(使用 bsddb3)的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 3.3 中打开 Berkeley 1.85 DB 文件
我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?