我想将BDB用作时间序列数据存储,并计划使用自纪元以来的微秒作为关键值。我使用BTREE作为数据存储类型。
但是,当我尝试存储整数键时,bsddb3会出错TypeError: Integer keys only allowed for Recno and Queue DB's
。
最佳解决方法是什么?我可以将它们存储为字符串,但这可能会使它不必要地变慢。
鉴于BDB本身可以处理任何类型的数据,为什么会有限制?我可以解决bsddb3实现吗?有没有人用过其他方法?
答案 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)
嗯,没有解决方法。但是你可以使用两种方法
使用str
或repr
将整数存储为字符串。如果整数很大,您甚至可以使用字符串格式
使用cPickle / pickle模块存储和检索数据。如果您拥有基本类型以外的数据类型,这是一种很好的方法。对于基础知识int
和float
s,这实际上比仅存储字符串更慢并占用更多空间