1

BerkleyDB JE でカーソルを使用すると、データセットをトラバースするとランダムな読み取り IO が大量に発生することがわかりました。これは、BDB が主キーの昇順でデータセットをトラバースするために発生します。

私のアプリケーションでは、データセットを順番に処理する必要はなく (数学的に言えば、私の操作は交換可能です)、スループットを最大化することに関心があります。

主キーの順序ではなく、ストアの順序でカーソルを使用してデータセットを処理する方法はありますか。

4

2 に答える 2

2

私はそうではないと思います。BDBJE はログ構造のデータベースです。つまり、すべての書き込みはログの末尾に追加されます。これは、レコードが常に最後のログに追加され、以前のログのレコードに取って代わる可能性があることを意味します。BDBJE は設計上、古いログに書き込むことができないため、古いレコードを置き換えられたものとしてマークすることはできません。そのため、ログの後半からレコードを処理しない限り、レコードが現在のものであるかどうかがわからないため、ストレージ処理レコードを順を追って進むことができません。

BDBJE は、ライブ レコードを新しいログにコピーし、古いファイルを削除することで、「ライブ」レコード数が減少するにつれて古いログを消去します。これにより、順序がさらにシャッフルされます。

私は、Kyoto Cabinet の Java バインディングが未加工の挿入パフォーマンスに関して BDB よりも高速であることを発見しました。また、カーソル順のレコード トラバースのパフォーマンスを最適化できるストレージ形式を選択できます。ライセンスは同様です (Kyoto Cabinet は GPL3、BDB は Oracle BDB ライセンス (コピーレフト))、どちらの場合も商用ライセンスの料金を支払わない限り。

更新 :バージョン 5.0.34 の時点で、BDBJE には、必要なユース ケースに対応する DiskOrderedCursor クラスが含まれています。これは、断片化されていないログ ファイルではディスク順序と同じである必要があるログ シーケンスでレコードをトラバースします。

于 2011-05-10T16:00:06.667 に答える
0

Db#get()またはDbc#get()メソッドのいずれかをflagと組み合わせて使用​​することで、連続していると思われる複数のレコードをバッファに読み込むことができる、新しい「一括アクセス」インタフェースが利用可能になりましDB_MULTIPLE

このドキュメントはバージョン 4.2.52 のもので、com.sleepycat.dbOracle のサイトでこのパッケージのドキュメントを見つけるのに苦労しました。ここでバージョン 4.8.30 のドキュメントを見つけましたが、クラスDbとクラスDbcについては言及されていません。

ああ、クラスMultipleEntryとは、上記MultipleDataEntryの使用に相当する有望なもののDB_MULTIPLEようです。たとえば、適切なサイズのバッファを使用してデータをフェッチすると、MultipleDataEntry大量のレコードが一緒に返され、それを を使用して分離することができますMultipleDataEntry#next()

インターフェイスのこの部分は流動的であるという印象を受けました。私のプロジェクトで利用できるライブラリの最新バージョンがないため、これらのバルク フェッチ インターフェイスをまだ使用したとは言えません。それらの使用を調査できる場合は、返信してください。

于 2011-05-10T20:10:18.983 に答える