我想使用 leveldb 在 c++ 和 python 中有效地存储整数和整数数组。
对于 C++ 中的整数,我可以将 int 转换为 char 数组。在 c++ 中存储 int 数组以及在 python 中存储 int 和 int 数组有什么建议吗?
您可以考虑使用像 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
在不了解您的用例的情况下很难说更多。每个数组平均要存储多少个整数?整数值的范围是多少?等等
对于int
c++ 中的数组,您必须将int
数组作为 achar*
传递给 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) );
对于 python,struct可以是高效的。这是一个使用leveldb-py中的 ctypes leveldb 接口的示例,将值 1,2,3,4,5(作为整数数组)存储在数据库中,键为 100:
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
为提高效率,如果您有大量写入操作,请导入特定函数(例如“from struct import pack”)并使用 leveldb 的 WriteBatch 类。
整数键/值可以存储在 LevelDB 中吗?建议可能需要自定义比较器,但是这个特定的 Python leveldb 接口不支持。 https://plyvel.readthedocs.org/en/latest/可能是更好的选择。