shelve
ドキュメントによると:
使用するデータベースパッケージ(dbm、gdbm、bsddbなど)の選択は、使用可能なインターフェイスによって異なります。
それはどういう意味ですか?どのパッケージが選択されたかを判断する方法は?どちらを選択する必要があるかを厳密に定義するにはどうすればよいですか?どのデータベース実装を使用するのが最適ですか?
shelve
ドキュメントによると:
使用するデータベースパッケージ(dbm、gdbm、bsddbなど)の選択は、使用可能なインターフェイスによって異なります。
それはどういう意味ですか?どのパッケージが選択されたかを判断する方法は?どちらを選択する必要があるかを厳密に定義するにはどうすればよいですか?どのデータベース実装を使用するのが最適ですか?
ここで見つけました:
http ://www.gossamer-threads.com/lists/python/python/13891
import shelve
import gdbm
def gdbm_shelve(filename, flag="c"):
return shelve.Shelf(gdbm.open(filename, flag))
db = gdbm_shelve("dbfile")
ps
リンクされたページで誰かがこれをどこかで見つけましたが、彼のリンクは死んでいます。
基盤となるデータベースを自分で指定する方法はないと思います。shelveはanydbmを使用し、anydbmはwhichdbモジュールを使用して、次のアンダーレイ実装を次の順序で試行します
Shelfのshelve.BsdDbShelfサブクラスを使用して、bsd * d*b実装の使用を強制できます。
どのパッケージが選択されたかを判断する方法は?
そのために内蔵モジュールwhichdb
を使用することができます。例えば:
In [34]: db = anydbm.open('test.db', 'c')
In [35]: db['test'] = '123'
In [36]: db.close()
In [37]: import whichdb
In [38]: dir(whichdb)
Out[38]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'_dbmerror',
'dbm',
'os',
'struct',
'sys',
'whichdb']
In [39]: whichdb.whichdb('test.db')
Out[39]: 'dbhash'
どのデータベース実装を使用するのが最適ですか?
モジュールは、基盤となるDBエンジンが次の場合のshelve
いくつかの制限について説明します(つまり、 Unix 、BSD DB、またはGNUGDBM互換性インターフェイスとインターフェイスdbm
するPythonモジュールと呼ばれます)。dbm
ndbm
ndbm
[...]これは、データベースに格納されているオブジェクト(のピクルス表現)がかなり小さい必要があることを意味し、まれに、キーの衝突によってデータベースが更新を拒否する場合があります。
これがndbm
適切なインターフェースにのみ適用されるのか、互換性インターフェースにも適用されるのかは明らかではありません。「かなり小さい」とは、数字で何を意味するのか。そして、それらのケースはどれほど「まれ」です。
実際、DBMのバインディングもあるRubyには、次のように書かれています。
元のBerkeleyDBは2GBのデータに制限されていました。Dbmライブラリは、キーと値のペアの合計サイズ、および同じ値にハッシュされるすべてのキーの合計サイズを制限する場合もあります。これらの制限は、512バイト程度にすることができます。そうは言っても、gdbmと最近のバージョンのBerkeley DBは、これらの制限をなくしています。
これが使用される可能性は非常に低く、これらの制限のいずれかに達すると(うまくいけば)説明的な例外がスローされるため、これについて心配する必要はないと思いndbm
ます。その時点で、さらに混乱する必要があります。