3

C++ と Python の両方で、leveldb を使用して整数と整数配列を効率的に格納したいと考えています。

C++ の整数の場合、int を char 配列に変換できます。int 配列を c++ に格納し、int および int 配列を Python に格納するための提案はありますか?

4

3 に答える 3

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

ユースケースについてもう少し知らずにこれ以上言うのは難しいです。配列ごとに平均でいくつの整数が格納されるでしょうか? 整数値の範囲は? 等

于 2012-01-27T01:03:14.263 に答える
0

intC ++の配列の場合、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) );
于 2012-01-24T09:05:03.710 に答える
0

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/の方が適切なオプションかもしれません。

于 2013-12-06T16:03:31.303 に答える