7

単純なKey-ValueストアであるJavaの永続的なハッシュ構造を探しています。ここで、keyは一意の文字列であり、valueはintです。キーの値は、既存のキーがストアに追加されるたびに増分されます。

私はこれをかなり大きくする必要があります-おそらく500m-10億キー。tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/を評価してきましたが、どれだけ拡張できるかわかりません。ハッシュが大きくなるにつれて、挿入時間が長くなるようです。

何が適切かについてのアイデアはありますか?

ありがとう

編集:ディスクI / Oを削減するために、メモリ内のHashMapにデータをキャッシュし、キャッシュが特定のサイズに拡大したときに永続ハッシュを一度に更新します。

Edit2:永続性の理由の1つは、RAMが4 GBに制限されているため、大きな構造をメモリに収めることができないことです。

4

5 に答える 5

5

Megamapはあなたが探しているものだと思います:http://megamap.sourceforge.net/。ホームページからのMegamapの簡単な説明は次のとおりです。

MegaMapは、マップ(またはハッシュテーブル)のJava実装であり、使用可能なディスク容量によってのみ制限される無制限の量のデータを格納できます。マップに保存されているオブジェクトはディスクに永続化されます。優れたパフォーマンスは、メモリ内キャッシュによって実現されます。MegaMapは、すべての実用的な理由から、無制限のストレージスペースを備えたマップ実装と考えることができます。

于 2010-10-04T08:37:32.323 に答える
2

ハッシュではなくデータベースを使用してください。データベースの場合でも、5億行がかなり大きくなっています。1秒あたり何回の更新を期待していますか?

于 2010-09-30T16:25:16.503 に答える
2

Berkeley BD Java Editionをチェックアウトしましたか?コレクションと互換性のあるAPIがありますStoredMapのJavadocも参照してください)。

于 2010-10-02T12:10:18.513 に答える
0

したがって、私が正しく理解していれば、Redisはオプションかもしれません。INCR [key]コマンドを発行して、そのキーに関連付けられた値をアトミックにインクリメントできます。キーが存在しない場合は、ゼロに設定されてからインクリメントされます(結果として1になります)。ドキュメントによると、INCRは定数時間の操作です。速度はRedisの主要な設計目標です。

Redisはそれ自体をファイルに永続化することができ、それがどのように発生するかに関するパラメーターを制御できます。

于 2010-09-30T16:41:08.837 に答える
0

Memcachedは、バックエンドの適切なデータベースとともに、あなたのケースに適したオプションだと思います。

于 2010-09-30T16:50:13.810 に答える