7

shelve ドキュメントによると:

使用するデータベースパッケージ(dbm、gdbm、bsddbなど)の選択は、使用可能なインターフェイスによって異なります。

それはどういう意味ですか?どのパッケージが選択されたかを判断する方法は?どちらを選択する必要があるかを厳密に定義するにはどうすればよいですか?どのデータベース実装を使用するのが最適ですか?

4

3 に答える 3

8

ここで見つけました:
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
リンクされたページで誰かがこれをどこかで見つけましたが、彼のリンクは死んでいます。

于 2013-02-02T18:35:41.590 に答える
4

基盤となるデータベースを自分で指定する方法はないと思います。shelveはanydbmを使用し、anydbmはwhichdbモジュールを使用次のアンダーレイ実装を次の順序で試行します

  • dbhash
  • gdm
  • dbm
  • dumbdbm

Shelfのshelve.BsdDbShelfサブクラスを使用して、bsd * d*b実装の使用を強制できます。

于 2012-12-30T17:09:52.640 に答える
1

どのパッケージが選択されたかを判断する方法は?

そのために内蔵モジュール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モジュールと呼ばれます)。dbmndbmndbm

[...]これは、データベースに格納されているオブジェクト(のピクルス表現)がかなり小さい必要があることを意味し、まれに、キーの衝突によってデータベースが更新を拒否する場合があります。

これがndbm適切なインターフェースにのみ適用されるのか、互換性インターフェースにも適用されるのかは明らかではありません。「かなり小さい」とは、数字で何を意味するのか。そして、それらのケースはどれほど「まれ」です。

実際、DBMのバインディングもあるRubyには、次のように書かれています

元のBerkeleyDBは2GBのデータに制限されていました。Dbmライブラリは、キーと値のペアの合計サイズ、および同じ値にハッシュされるすべてのキーの合計サイズを制限する場合もあります。これらの制限は、512バイト程度にすることができます。そうは言っても、gdbmと最近のバージョンのBerkeley DBは、これらの制限をなくしています。

これが使用される可能性は非常に低く、これらの制限のいずれかに達すると(うまくいけば)説明的な例外がスローされるため、これについて心配する必要はないと思いndbmます。その時点で、さらに混乱する必要があります。

于 2017-12-12T10:39:54.507 に答える