我想使用leveldb在c ++和python中有效地存储整数和整数数组。
对于C ++中的整数,我可以将int转换为char数组。有关在c ++中存储int数组的建议以及在python中的int和int数组吗?
答案 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/可能是更好的选择。