0

データベースに何百万ものエントリを保存する必要があります。各エントリは、一意の整数識別子のセットによって識別されます。たとえば、値は、それぞれが1億未満である10個の整数識別子のセットによって識別される場合があります。

データベースのサイズを小さくするために、単一の32ビット整数値を使用した次のエンコードを考えました。

識別子1:0-100,000,000
識別子2:100,000,001〜200,000,000
。
。
。
識別子10:900,000,001-1,000,000,000

私はJavaを使用しています。エンコード/デコードする簡単なメソッドを書くことができます。ユーザーコードは、フェッチ/ストア中にエンコード/デコードしていることを知る必要はありません。

私が知りたいのは、そのようなエンコード/デコードを実装するための最も効率的(最速)で推奨される方法は何ですか。単純な実装では、多数の乗算/減算が実行されます。

シフト(またはビット演算)を使用して、異なるパーティションサイズを選択することは可能ですか(各セグメントのサイズは1億に近い必要があります)?

私はどんな提案、アイデア、あるいは全く異なる計画さえも受け入れます。整数識別子が制限されているという事実を利用して、パフォーマンスを著しく損なうことなくストレージサイズを大幅に削減したいと思います。

編集:私はこのフォーラムに投稿された回答のいくつかを通過したことを追加したかっただけです。一般的な解決策は、各識別子のビットを分割することでした。各識別子に2ビットを使用して合計10個の識別子を使用すると、識別子の範囲が大幅に制限されます。

4

3 に答える 3

1

0...100m の複数の整数値を単一の 32 ビット整数にパックしたいようですね。これらの 0 ~ 100m の値をより効率的に格納できる重要な情報を省略しない限り、それを行う方法はまったくありません。

ceil(log2(100m)) = 27 ビット、つまり「スペア ビット」が 5 つしかないことを意味します。

于 2012-04-10T15:45:24.717 に答える
1

セグメンテーション サイズを 27 ビットにすると、32 * 128 M セグメントになります。42 * 100 M の代わりに

int value = 
int high = value >>> 27;
int low = value & ((1L << 27) -1);

データベースを使用するコストに比べれば、この計算は取るに足らないものである可能性が高いため、何の価値もありません。

于 2012-04-10T15:37:58.540 に答える
1

実際に何をしたいのかは不明ですが、各ビットが特定の属性を持ち、 bitmask適用することを表す整数値が必要なようです。

32 ビット整数は、32 の異なる属性、64 ビット 64 などを保存できます。さらに多くの属性を含めるには、複数の整数列が必要になります。

そうでなければ、「エンコード」の意味がわかりません。

于 2012-04-10T15:38:52.363 に答える