0

BDB を時系列データ ストアとして使用したいと考えており、エポックからのマイクロ秒をキー値として使用する予定です。データ ストア タイプとして BTREE を使用しています。

ただし、整数キーを格納しようとすると、bsddb3 でエラーが発生しますTypeError: Integer keys only allowed for Recno and Queue DB's

最善の回避策は何ですか? それらを文字列として保存できますが、おそらく不必要に遅くなります。

BDB自体はあらゆる種類のデータを処理できるのに、なぜ制限があるのですか? bsddb3 の実装をちょっとハックできますか? 誰かが他の方法を使用しましたか?

4

2 に答える 2

1

bsddb は整数の表現方法と整数の種類がわからないため、整数を格納することはできません。

整数を文字列に変換すると、bsddb: のキーの辞書式順序が破られますが、文字列として変換10 > 2されます"10" < "2"

python structを使用して整数を文字列に変換し (または python 3 ではバイトに)、格納してから bsddb に格納する必要があります。bigendian パッキングを使用する必要があります。そうしないと、順序が正しくなくなります。

次に、bsddb を使用Cursor.set_range(key)して、特定の時間内に情報を照会できます。

たとえば、Cursor.set_range(struct.unpack('>Q', 123456789))123456789 で発生するイベントのキーまたはその後に発生する最初のキーにカーソルを設定します。

于 2015-08-21T19:00:27.830 に答える
-1

まあ、回避策はありません。ただし、2つのアプローチを使用できます

  1. strまたはを使用して、整数を文字列として保存しますrepr。int が大きい場合は、文字列の書式設定を使用することもできます

  2. cPickle/pickle モジュールを使用してデータを保存および取得します。これは、基本型以外のデータ型がある場合に適した方法です。basicsintおよびfloats の場合、これは実際には文字列を格納するよりも遅く、より多くのスペースを必要とします

于 2013-09-13T19:17:46.767 に答える