C++ と Python の両方で、leveldb を使用して整数と整数配列を効率的に格納したいと考えています。
C++ の整数の場合、int を char 配列に変換できます。int 配列を c++ に格納し、int および int 配列を Python に格納するための提案はありますか?
構造化データをシリアル化 (非) できる 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
配列を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の場合、構造体は効率的です。以下は、 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
より効率的に行うには、特定の関数をインポートし (例: 「構造体インポート パックから」)、大量の書き込みを行う場合は、leveldb の WriteBatch クラスを使用します。
整数のキー/値を LevelDB に格納できますか? カスタムコンパレータが必要になる可能性があることを示唆していますが、この特定の Python leveldb インターフェイスはそれをサポートしていません。 https://plyvel.readthedocs.org/en/latest/の方が適切なオプションかもしれません。