1

Berkeley DBを使用して度数分布表(つまり、文字列キーと整数値を持つハッシュテーブル)を保存しようとしています。テーブルはPythonから書き込まれ、更新され、読み取られます。だから私は現在bsddb3を試しています。これは、文字列値のみをサポートしているように見えることを除いて、私が望むほとんどのことを実行するように見えますか?

私が正しく理解していれば、BerkeleyDBはあらゆる種類のバイナリキーと値をサポートしています。bsddb3を使用してBerkeleyDBに生の長整数を効率的に渡す方法はありますか?値を文字列との間で変換できることはわかっています。これはおそらく私が最終的に行うことですが、より効率的な方法はありますか?つまり、「生の」整数を格納することによって?


背景:私は現在、大きな(数百万とまではいかなくても数千万のキー)度数分布表を使用しています。これは現在Pythonディクショナリを使用して実装されていますが、仮想メモリへのスワップを開始するとスクリプトを中止します。はい、Redisを見ましたが、これによりデータベース全体がメモリに保存されます。だから私はバークレーDBを試してみようとしています。短期間のメモリ内キャッシュを使用することで、作成効率を向上させることができるはずです。つまり、メモリ内のPythonディクショナリを作成し、これを定期的にマスターBerkeleyDB頻度テーブルに追加します。

4

2 に答える 2

1

Python以外の言語からデータを読み戻す必要がありますか?そうでない場合は、Pythonの長整数でpickleを使用し、それらを読み戻すときにそれらのpickleを解除できます。shelveモジュールを使用できる可能性があります(おそらく使用できる可能性があります)。これにより、これが自動的に行われます。ただし、そうでない場合でも、手動で値をピクルスおよびピクルス解除できます。

>>> import cPickle as pickle
>>> pickle.dumps(19999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, pickle.HIGHEST_PROTOCOL)
'\x80\x02\x8a(\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7fT\x97\x05p\x0b\x18J#\x9aA\xa5.{8=O,f\xfa\x81|\xa1\xef\xaa\xfd\xa2e\x02.'
>>> pickle.loads('\x80\x02\x8a(\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7fT\x97\x05p\x0b\x18J#\x9aA\xa5.{8=O,f\xfa\x81|\xa1\xef\xaa\xfd\xa2e\x02.')
19999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999L
于 2012-05-02T14:28:49.567 に答える
0

Pythonstructは、Python 3では整数をバイトに、Python 2では文字列に変換します。データに応じて、unsigned longlongまたはuint64_t:に異なるパッキング形式を使用する場合があります。

struct.unpack('>Q', my_integer)

これにより、bsddbキー値に必要な辞書式順序に一致するmy_integeronbigendianバイト表現が返されます。wiredtiger.intpackingスペースを節約するために、よりスマートなパッキング機能(を見てください)を搭載することができます。

Pythonキャッシュは必要ありません、使用DBEnv.set_cache_maxしてset_cacheください。

于 2015-08-21T20:09:34.407 に答える