Найти - Пользователи
Полная версия: bsddb
Начало » Базы данных » bsddb
1
shiza
Начал разбираться с bsddb.
Хочу использовать ее для синхронизации между собой нескольких копий веб-приложения.
Не могу сообразить по поводу двух моментов:
1. как сделать чтоб файл подчистился (или как это называется) (или может автоподчистка какая есть), после того как из него данные удаляешь.
2. Как организовать транзакции?
3. как сдать такую штуку: надо записать что-то с ключом, но если такой ключ уже есть в базе - надо как-то узнать об этом (какое-то исключение должно генерироваться (?)
shiza
с вопросом 3 - разобрался =)
надо делать put с флагом db.DB_NOOVERWRITE
Андрей Светлов
Новый стиль есть в bsddb.db для python 2.5. Транзакции в том числе.
Документация здесь: http://pybsddb.sourceforge.net/bsddb3.html

Но я бы рекомендовал использовать sqlite для тех же целей (bsddb, наверное, быстрее - но SQL роднее и гибче. Для меня не столь критична скорость на данном уровне абстракции). В 2.5 стандартный модуль sqlite3 дает DBAPI 2.0 совместимый интерфейс. И - весьма быстрая sql база данных
shiza
Андрей Светлов
SQLite я знаю и пользовать умею.
Но хочу попробовать и bsddb. В нкоторых случаях мне он кажется более оптимальным выбором (правда пока не разобрался с ним, трудно сказать в каких %) ).

По http://pybsddb.sourceforge.net/bsddb3.html тоже лазил.
Может есть какие-нибудь паттерны насчет транзакций? (ну и с тем, как делать подчистку файла - пока не нашел)
Андрей Светлов
транзакции - как обычно

tx = dbenv.txn_begin()

try:

tx.commit()
except:
tx.abort()

Из достоинств: two phase transactions (sqlite пока еще не умеет, поправьте, если не так).
bsddb и sqlite все больше и больше сближаются в области эффективного применения.

По поводу “подчистки” - sync это не делает?
Приведи пример “разбухания” файла - на питоне, разумеется. Посмотрю.
shiza
Андрей Светлов
Насчет транзакций - спасибо. Сразу все стало на свои места.


Насчет неуменьшения размера файла - это такая особенность почти во всех базах данных, для большей эффективности.
Но если уж надо подчистить… в SQLite для похожих целей помню была команда VACUUM и флаг auto_vacuum.

Записали в базу и удалили из базы, получили файл на мегабайт:
from bsddb import db

mydb = db.DB()
mydb.open("tst.db", None, db.DB_HASH, db.DB_CREATE)

for i in xrange(10000):
mydb.put(str(i), 'd' * 40)

for i in xrange(10000):
mydb.delete(str(i))

mydb.sync()
print len(mydb.keys())
mydb.close()
Андрей Светлов
Ничего толком не увидел. Но если использовать потом

mydb = db.DB()
mydb.open('tst2.db', None, db.DB_HASH, db.DB_CREATE)
mydb.upgrade('tst.db')
mydb.put(str(1), ‘d’ * 40)
mydb.close()

- база заметно усыхает
shiza
Андрей Светлов
У меня не усыхает (WindowsXP, Python 2.5.2 ( Bdb 4.4.20))

Разобрался с подчисткой:
В нативном движке есть функция compact.
В биндинге к питону она не реализована, но исправить это недоразумение поможет патч (с перекомпиляцией):
http://bugs.python.org/issue1391
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB