leveldb中的整数值

时间:2011-12-08 22:05:08

标签: c++ python integer leveldb

我想使用leveldb在c ++和python中有效地存储整数和整数数组。

对于C ++中的整数,我可以将int转换为char数组。有关在c ++中存储int数组的建议以及在python中的int和int数组吗?

3 个答案:

答案 0 :(得分:1)

对于c ++中的int数组,您必须将int数组作为char*传递给Slice类,然后您可以轻松地将其放入leveldb数据库,例如

int myArray[3] = {1,2,3};
Slice valueSlice = Slice( (const char*) myArray, sizeof(myArray) );

这基本上适用于所有类型以及自定义类,例如

MyClass* newObj = new MyClass();
Slice valueSlice = Slice( (const char*) newObj, sizeof(MyClass) );

答案 1 :(得分:1)

您可以考虑使用像Google的protobuf(http://code.google.com/p/protobuf/)这样的库,它能够(反)序列化结构化数据。对于你提到的情况,重复的字段可以解决问题:

message List {
  repeated int64 val = 1;
}

鉴于协议缓冲区使用的varint编码(并且取决于您的值范围),这可能是存储整数的有效方法。

http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints

如果不了解您的用例,就很难说更多。平均每个阵列将存储多少个整数?整数值的范围是多少?等

答案 2 :(得分:0)

对于python,struct可以很有效率。下面是一个使用来自leveldb-py的ctypes leveldb接口的示例,它使用密钥100在数据库中存储值1,2,3,4,5(作为整数数组):

import leveldb,array,struct

#this assumes 32-bit unsigned integers in machine order
value=struct.pack('p',array('I',[1,2,3,4,5]))
key=struct.pack('I',100)

db=leveldb.DB("/path/to/db", create_if_missing=True)
db[key]=value

为了提高效率,请导入特定的函数(例如“来自struct import pack”)并使用lelveldb的WriteBatch类,如果你有一堆写入的话。

Can integer keys / values be stored in LevelDB?表明可能需要自定义比较器,但是这个特定的Python leveldb接口不支持它。 https://plyvel.readthedocs.org/en/latest/可能是更好的选择。