shelve
documentation说:
选择使用哪个数据库包(例如dbm,gdbm 或bsddb)取决于可用的接口。
这是什么意思?如何确定选择哪个包?如何严格定义必须选择哪一个?最好使用哪种数据库实现?
答案 0 :(得分: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
在链接页面中,有人也发现了这个,但他的链接已经死了。
答案 1 :(得分:4)
我认为没有办法自己指定底层数据库。 搁置使用 anydbm 和 anydbm 使用 whichdb 模块,该模块按以下顺序尝试以下底层实现
您可以使用 Shelf 的 shelve.BsdDbShelf 子类来强制使用bsd * d * b实现。
答案 2 :(得分: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'
最适合使用哪种数据库实现?
shelve
模块讨论了一些限制,如果底层数据库引擎是dbm
(即称为dbm
的Python模块,它与Unix ndbm
或BSD接口DB或ndbm
的GNU GDBM兼容性接口:
[...]这意味着存储在数据库中的对象(被腌制的表示)应该相当小,并且在极少数情况下,密钥冲突可能导致数据库拒绝更新。
目前尚不清楚这是否仅适用于ndbm
本身,还是兼容接口;什么"相当小"意思是数字;以及如何"罕见"是那些案件。
实际上,Ruby也有DBM的绑定,它有this to say:
原始Berkeley DB限制为2GB数据。 Dbm库有时也会限制键/值对的总大小,以及散列到相同值的所有键的总大小。这些限制可以低至512字节。也就是说,gdbm和Berkeley DB的最新版本都没有这些限制。
我认为这没什么可担心的,因为ndbm
使用cat /proc/interrupts
的可能性很小,因为达到任何这些限制都会(希望)引发描述性异常,我们需要进一步解决这个问题。