Cách xác định gói nào được chọn?
Mô-đun tích hợp whichdb
có thể được sử dụng cho điều đó. Ví dụ:
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'
thực hiện tốt nhất cơ sở dữ liệu gì để sử dụng không?
Các shelve
cuộc đàm phán mô-đun về một số hạn chế nếu động cơ DB cơ bản là dbm
(ví dụ, các mô-đun Python gọi dbm
, giao diện với Unix ndbm
hoặc BSD DB hoặc các giao diện tương thích GNU GDBM cho ndbm
):
[...] điều này có nghĩa là (đại diện được chọn) các đối tượng được lưu trữ trong cơ sở dữ liệu phải khá nhỏ và trong một số ít trường hợp, các va chạm chính có thể khiến cơ sở dữ liệu từ chối cập nhật.
Không rõ liệu điều này chỉ áp dụng cho ndbm
thích hợp hay giao diện tương thích; những gì "khá nhỏ" có nghĩa là về số lượng; và cách "hiếm" là những trường hợp đó.
Trên thực tế, Ruby, cũng đã gán cho DBM, có this to say:
gốc Berkeley DB được giới hạn 2GB dữ liệu. Thư viện Dbm đôi khi cũng giới hạn tổng kích thước của cặp khóa/giá trị và tổng kích thước của tất cả các khóa mà băm có cùng giá trị. Các giới hạn này có thể ít nhất là 512 byte. Điều đó nói rằng, gdbm và các phiên bản gần đây của Berkeley DB loại bỏ các giới hạn này.
Tôi cho rằng điều này không có gì phải lo lắng, bởi vì nó không chắc rằng ndbm
sẽ được sử dụng và bởi vì nhấn bất kỳ giới hạn nào (hy vọng) lộn xộn xung quanh hơn nữa.
Vì vậy, trong trường hợp sử dụng 'shelve.BsdDbShelf', bạn không cần phải có gói' bsddbm'? –