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

时间:2013-09-06 19:11:55

标签: python berkeley-db bsddb

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:-1)

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

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

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