2011-12-08 10 views
3

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

C++の整数の場合、intをchar配列に変換できます。 int配列をC++とintに格納するための提案とint配列をPythonで?あなたは、簡単にleveldbデータベースに置くことができるスライスクラス、例えばにchar*としてint配列を渡す必要があり、C++でintアレイの場合

答えて

0

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

あなたは(デ)構造化データをシリアライズすることができ、GoogleのいるProtobuf(http://code.google.com/p/protobuf/)のようなライブラリを使用することを検討してください可能性があります。プロトコルバッファが使用する(と値のあなたの範囲に応じて)これは整数を格納するための効率的な方法かもしれvarintエンコーディングを考える

message List { 
    repeated int64 val = 1; 
} 

:あなたが言及した場合には、繰り返しフィールドは、トリックを行うだろう。

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

あなたのユースケースについて、もう少しを知らなくてもより多くを語るのは難しいです。配列ごとに平均で何個の整数が格納されますか?整数値の範囲は何ですか?

0

(Python用)structは効率的です。ここでキー100を使用してデータベース内の(整数の配列として)値1,2,3,4,5を格納leveldb-pyからのctypes leveldbインタフェースを使用した例である。

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")を使用してlelveldbのWriteBatchクラスを使用してください。

Can integer keys/values be stored in LevelDB?はカスタムコンパレータが必要かもしれないと示唆していますが、この特定のPython leveldbインタフェースはそれをサポートしていません。 https://plyvel.readthedocs.org/en/latest/が良い選択肢かもしれません。

+0

keydbをレベルストアとして使用している場合は、カスタムコンパレータは必要ありません。 –