カーソルを使用して、Berkeley DB データベース内の一連のキーを取得しています。フラグを使用して get を実行し、DB_SET_RANGE
その後にフラグを使用していくつかの get を実行しDB_NEXT
ます。
すべて正常に動作します。問題は、この特定の操作に必要なのはキーだけですが、常にキーと関連する値の両方を取得することです。値はかなり大きくなる可能性があるため (数百キロバイト)、取得は避けたいと思います。何か案は?
カーソルを使用して、Berkeley DB データベース内の一連のキーを取得しています。フラグを使用して get を実行し、DB_SET_RANGE
その後にフラグを使用していくつかの get を実行しDB_NEXT
ます。
すべて正常に動作します。問題は、この特定の操作に必要なのはキーだけですが、常にキーと関連する値の両方を取得することです。値はかなり大きくなる可能性があるため (数百キロバイト)、取得は避けたいと思います。何か案は?
DatabaseEntry.setPartialメソッド (len=0 を指定) を使用して、値からデータを取得しないように BerkeleyDB エンジンに指示できると思います。
興味深い問題です。鍵だけを手に入れることが可能だとは思いません。
1 つのアプローチは、キーをデータなしで独自のデータベースに格納することです。重複に耐えられない場合は、定義上、値の範囲の参照の局所性が良好であるため、一括読み取りが最善の方法だと思います。DBC::get() 呼び出しで DB_MULTIPLE_KEY フラグを使用し、データ用に大きな DBT バッファーを使用します。DbMultipleKeyDataIterator を使用して、一括取得したブロックを反復処理します。
これにより、検索内の連続するリーフ アイテムによって、DBC::get で使用する DBT 一時バッファーへの効率的なページ コピーが行われるため、状況が改善されるはずです。