BerkleyDB JE でカーソルを使用すると、データセットをトラバースするとランダムな読み取り IO が大量に発生することがわかりました。これは、BDB が主キーの昇順でデータセットをトラバースするために発生します。
私のアプリケーションでは、データセットを順番に処理する必要はなく (数学的に言えば、私の操作は交換可能です)、スループットを最大化することに関心があります。
主キーの順序ではなく、ストアの順序でカーソルを使用してデータセットを処理する方法はありますか。
BerkleyDB JE でカーソルを使用すると、データセットをトラバースするとランダムな読み取り IO が大量に発生することがわかりました。これは、BDB が主キーの昇順でデータセットをトラバースするために発生します。
私のアプリケーションでは、データセットを順番に処理する必要はなく (数学的に言えば、私の操作は交換可能です)、スループットを最大化することに関心があります。
主キーの順序ではなく、ストアの順序でカーソルを使用してデータセットを処理する方法はありますか。
私はそうではないと思います。BDBJE はログ構造のデータベースです。つまり、すべての書き込みはログの末尾に追加されます。これは、レコードが常に最後のログに追加され、以前のログのレコードに取って代わる可能性があることを意味します。BDBJE は設計上、古いログに書き込むことができないため、古いレコードを置き換えられたものとしてマークすることはできません。そのため、ログの後半からレコードを処理しない限り、レコードが現在のものであるかどうかがわからないため、ストレージ処理レコードを順を追って進むことができません。
BDBJE は、ライブ レコードを新しいログにコピーし、古いファイルを削除することで、「ライブ」レコード数が減少するにつれて古いログを消去します。これにより、順序がさらにシャッフルされます。
私は、Kyoto Cabinet の Java バインディングが未加工の挿入パフォーマンスに関して BDB よりも高速であることを発見しました。また、カーソル順のレコード トラバースのパフォーマンスを最適化できるストレージ形式を選択できます。ライセンスは同様です (Kyoto Cabinet は GPL3、BDB は Oracle BDB ライセンス (コピーレフト))、どちらの場合も商用ライセンスの料金を支払わない限り。
更新 :バージョン 5.0.34 の時点で、BDBJE には、必要なユース ケースに対応する DiskOrderedCursor クラスが含まれています。これは、断片化されていないログ ファイルではディスク順序と同じである必要があるログ シーケンスでレコードをトラバースします。
Db#get()
またはDbc#get()
メソッドのいずれかをflagと組み合わせて使用することで、連続していると思われる複数のレコードをバッファに読み込むことができる、新しい「一括アクセス」インタフェースが利用可能になりましたDB_MULTIPLE
。
このドキュメントはバージョン 4.2.52 のもので、com.sleepycat.db
Oracle のサイトでこのパッケージのドキュメントを見つけるのに苦労しました。ここでバージョン 4.8.30 のドキュメントを見つけましたが、クラスDb
とクラスDbc
については言及されていません。
ああ、クラスMultipleEntry
とは、上記MultipleDataEntry
の使用に相当する有望なもののDB_MULTIPLE
ようです。たとえば、適切なサイズのバッファを使用してデータをフェッチすると、MultipleDataEntry
大量のレコードが一緒に返され、それを を使用して分離することができますMultipleDataEntry#next()
。
インターフェイスのこの部分は流動的であるという印象を受けました。私のプロジェクトで利用できるライブラリの最新バージョンがないため、これらのバルク フェッチ インターフェイスをまだ使用したとは言えません。それらの使用を調査できる場合は、返信してください。