0

MapDB に数十億のキーと値のペアを保存したいと考えています。特定の要件があります。

キー = long (8 バイト) 値 = (UUID + 開始日 + 終了日) の最大 5 エントリ、つまり 5 * 32 バイト = 160

要件は、シングル スレッド アプリを使用することです。キーによってロードし、エントリ内の日付の 1 つを変更します。値のサイズは変更されません。

get と put を行うための最も効率的なセットアップは何だろうか。160 のバイト配列を事前に割り当て、それを値として使用することでパフォーマンスが向上しますか? それとも問題ではなく、サイズが柔軟なバイト配列を使用するだけですか?

現在、私は持っています

       DB db = DBMaker
            .newFileDB(dbFile)
            .asyncWriteEnable()
            .asyncWriteFlushDelay(100)
            .transactionDisable()
            .make();

ポンプ:

       BTreeKeySerializer keySerializer = BTreeKeySerializer.ZERO_OR_POSITIVE_LONG;
       Map<Long, Item> map = db.createTreeMap("map")
            .pumpSource(source)
            .keySerializer(keySerializer)
            .make();

ソースはどこですか

Iterator<Fun.Tuple2<Long, byte[]>> source = new Iterator<Fun.Tuple2<Long, byte[]>>()

読み込み中

        Map<Long, byte[]> map = db.<Long, byte[]>getTreeMap("map");

datapump を使用して 20,000,000 個のアイテムをマップにロードした後 (時間の経過とともにパフォーマンスが低下します)、ルックアップは少し残念です:

199,999 ミリ秒で 200,000 回のルックアップ。(約1000回/秒)

テスト アプリを 2 回目に実行すると、ルックアップが劇的に増加します。

7,597 ミリ秒で 200,000 回のルックアップ。

キー/値の固定サイズ要件を考慮して、パフォーマンスを改善するためにできることはありますか? 有効にできるオプションはありますか?

データ ポンプがあるため、TreeMap を使用しました。HashMap を使用すると、パフォーマンスが大幅に向上しますか?

乾杯!

4

1 に答える 1

0

MapDB の作成者はこちら。

最初に特殊なキー/値シリアライザーを使用します。何かのようなもの:

db.createTreeMap("map").keySerializer(BTreeKeySerializer.STRING).makeOrGet();

次に、1.0 ブランチでパフォーマンスのバグが発生しています。これは 2.0 で解決されましたが、そのブランチはまだ安定していません。

于 2015-04-06T10:12:29.070 に答える