整数キーと整数値をサポートするキー値ストアを検索しました。LevelDB は良いオプションのようですが、整数値/キーがサポートされているかどうかについての情報は見つかりません
4 に答える
LevelDBにはほとんど何でも保存できます。構造を介してデータの不透明なスライスをLevelDBに提供しますSlice
。次に例を示します。
int intKey = 256;
int intValue = 256*256;
Slice key((char*)&intKey, sizeof(int));
Slice value((char*)&intValue, sizeof(int));
db->Put(leveldb::WriteOptions(), key, value);
そして、それはほとんどそれです!
ただし、注意すべき点の1つは、整数をLevelDBに(キーと値の両方として)格納することは一般に問題ありませんが、整数は経由で順序付けられるため、キーはバイト単位のBytewiseComparator
比較をサポートする必要があるということです。これは、キーの特定の順序に依存する場合は、システムのエンディアンに注意する必要があることも意味します。
インターフェイスを介して独自のコンパレータを作成することもできます。Comparator
これにより、デフォルトを置き換えることができますBytewiseComparator
。
多くの場合、整数キーのより精巧なエンコード スキームを選択することをお勧めします。int を char* の 2 の補数表現にパックすること (この質問に対する別の回答で提案されているように) は、1 つのオプションです。varint エンコーディングは別のものです (小さな整数のスペースを節約し、上限なしで任意の数値を格納できます)。
リンクの答えを拡大するには、私が書いている本の一部としてこの正確なことをいじっていたという理由もあり、彼/彼女が以下で話している BytewiseComparator の結果を見ることができます。
もう 1 つの方法は、バイナリ整数をビッグ エンディアン形式に変換して、デフォルトのコンパレータで正常にソートされるようにすることです。これにより、キーの構成が容易になります。
long flippedI = htonl(i);
LevelDB は非常に高速であることに注意してください。私は iPhone4 で 50,000 のセカンダリ キーを持つテキスト キー レコードを使用してテストを行ったので、約 100,000 のキーと値のペアでそれは悲鳴を上げました。
データベースで永久に使用され、数値以外のキーに ByteWiseComparator を引き続き使用するカスタム Comparator を作成するのは非常に簡単です。最大の問題は、カスタム ルールの対象となるキーを決定することです。
単純な方法は、すべての非整数キーは 4 文字を超える長さであり、4 バイトのキーは整数であると想定することです。つまり、末尾のスペースなどを追加してプッシュする必要があるだけです。それはすべて非常に恣意的であり、あなた次第ですが、あなたが持っている唯一の2つの情報は、重要なコンテンツとその長さであることを覚えておいてください. 特定のキーの他のメタデータはありません。
標準の BytewiseComparator を備えたデータベースを使用した、1 から始まり 1 から 1000 までの int キーを持つ標準コンパレータのサンプルの結果の一部
Listing the keys in decimal and hex
256 ( 100)
512 ( 200)
768 ( 300)
1 ( 1)
257 ( 101)
513 ( 201)
769 ( 301)
2 ( 2)
258 ( 102)
514 ( 202)
770 ( 302)
3 ( 3)
259 ( 103)
515 ( 203)
771 ( 303)
...
254 ( fe)
510 ( 1fe)
766 ( 2fe)
255 ( ff)
511 ( 1ff)
767 ( 2ff)