我想使用 BDB 作为时间序列数据存储,并计划使用自纪元以来的微秒作为键值。我使用 BTREE 作为数据存储类型。
但是,当我尝试存储整数键时,bsddb3 会给出错误提示TypeError: Integer keys only allowed for Recno and Queue DB's
。
最好的解决方法是什么?我可以将它们存储为字符串,但这可能会使它不必要地变慢。
鉴于 BDB 本身可以处理任何类型的数据,为什么会有限制?我可以破解 bsddb3 实现吗?有人用过其他方法吗?
我想使用 BDB 作为时间序列数据存储,并计划使用自纪元以来的微秒作为键值。我使用 BTREE 作为数据存储类型。
但是,当我尝试存储整数键时,bsddb3 会给出错误提示TypeError: Integer keys only allowed for Recno and Queue DB's
。
最好的解决方法是什么?我可以将它们存储为字符串,但这可能会使它不必要地变慢。
鉴于 BDB 本身可以处理任何类型的数据,为什么会有限制?我可以破解 bsddb3 实现吗?有人用过其他方法吗?
您不能存储整数,因为 bsddb 不知道如何表示整数以及它是哪种整数。
如果将整数转换为字符串,则会破坏 bsddb: 键的字典顺序,10 > 2
但作为 strings "10" < "2"
。
您必须使用 python struct将整数转换为字符串(或在 python 3 中转换为字节)以存储然后将它们存储在 bsddb 中。您必须使用 bigendian 包装,否则订购将不正确。
然后您可以使用 bsddbCursor.set_range(key)
在给定的时间片内查询信息。
例如,Cursor.set_range(struct.unpack('>Q', 123456789))
将光标设置在 123456789 或之后发生的第一个事件的键上。
好吧,没有解决方法。但是你可以使用两种方法
str
使用or将整数存储为字符串repr
。如果整数很大,您甚至可以使用字符串格式
使用 cPickle/pickle 模块来存储和检索数据。如果您有基本类型以外的数据类型,这是一个好方法。对于 basicsint
和float
s 这实际上比存储字符串更慢并且占用更多空间