web-dev-qa-db-ja.com

180億のキーと値のペアを保存する最適な方法

私は約2億の新しいオブジェクトを受け取っており、90日間の保持ポリシーがあるため、キーと値のペアの形式で保存する必要のある180億のレコードが残ります。

キーと値の両方が文字列になります。これは基本的に、アプリケーション内のオブジェクトの一意の識別子と実際のオブジェクトストレージ内のオブジェクトの一意の識別子との間のマッピングです。

オブジェクトをWeb OSにロードするアプリケーションがあります。ロードするオブジェクトごとに、16文字の文字列キー(DataIDなど)を作成します。 Web OS自体が、ObjectIDなどの40文字の文字列キーを作成します。だから私がやろうとしているのは、180億のオブジェクトのDataID-> ObjectID間のマッピングを作成することです。 IDの作成に使用されているメカニズムがわかりません。

私は対処する必要があります:

write(key,value)
read(key)
delete(key,value)

これを実装するための最適な方法のアイデアを探しています。読み取りと書き込み用に最適化する必要があります。スペースの最適化は二次的なものです。

私はHadoop/NoSQLが1つの方法であることを知っています。おそらく別のソリューションが分散ハッシュテーブルになるでしょうが、さらにいくつかのオプションがどれが最良のソリューションであるかを判断するのに役立ちます。現在の環境には既存のRDBMSがないため、リレーショナルデータベースはオプションではありません。

6
Chaos

redis を試してください。そのすべてがメモリ内にあり、データをダンプするため、リセット時にホットにすることができます。ただし、ダンプする前に通常1〜2秒待機するため、データを失わないようにする必要がある場合は、注意して設定を変更する必要がある場合があります(または、デフォルトの設定を間違って覚えていませんか?)。

GUID/6または7ビットがキーで、残りがフィールド http://redis.io/commands/hmset であるハッシュを使用します。フィールド名を増やすと速度が低下することに注意してください。私の個人的な経験則として、128以下に固執します。 64ビットまたは32ビットをお勧めしますが、キー長でテストしてください。

ハッシュを使用する理由は、メモリ使用量を減らすためです。より多くのフィールド=より少ないポインター(およびCPU時間の増加)

6
user2528

これらのキーと値のストアを見てください: Berkeley DB Java Edition 、またはJDBM( JDBM が最新)、または MapDB (JDBM後継) Tokyo Cabinet はネイティブではありませんJavaですが、Javaラッパーがあります。

概要については http://en.wikipedia.org/wiki/Dbm を参照してください。

5
Dan Halbert