leveldb中的整数值

Integer values in leveldb

本文关键字:整数 leveldb      更新时间:2023-10-16

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

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

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

message List {
  repeated int64 val = 1;
}

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

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

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

对于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) );

对于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/可能是更好的选择