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 を使用すると、パフォーマンスが大幅に向上しますか?
乾杯!