Форум сайта python.su
Начал разбираться с bsddb.
Хочу использовать ее для синхронизации между собой нескольких копий веб-приложения.
Не могу сообразить по поводу двух моментов:
1. как сделать чтоб файл подчистился (или как это называется) (или может автоподчистка какая есть), после того как из него данные удаляешь.
2. Как организовать транзакции?
3. как сдать такую штуку: надо записать что-то с ключом, но если такой ключ уже есть в базе - надо как-то узнать об этом (какое-то исключение должно генерироваться (?)
Отредактировано (Июнь 6, 2008 20:45:31)
Офлайн
с вопросом 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 база данных
Офлайн
Андрей Светлов
SQLite я знаю и пользовать умею.
Но хочу попробовать и bsddb. В нкоторых случаях мне он кажется более оптимальным выбором (правда пока не разобрался с ним, трудно сказать в каких %) ).
По http://pybsddb.sourceforge.net/bsddb3.html тоже лазил.
Может есть какие-нибудь паттерны насчет транзакций? (ну и с тем, как делать подчистку файла - пока не нашел)
Отредактировано (Июнь 6, 2008 22:28:04)
Офлайн
транзакции - как обычно
tx = dbenv.txn_begin()
try:
…
tx.commit()
except:
tx.abort()
Из достоинств: two phase transactions (sqlite пока еще не умеет, поправьте, если не так).
bsddb и sqlite все больше и больше сближаются в области эффективного применения.
По поводу “подчистки” - sync это не делает?
Приведи пример “разбухания” файла - на питоне, разумеется. Посмотрю.
Офлайн
Андрей Светлов
Насчет транзакций - спасибо. Сразу все стало на свои места.
Насчет неуменьшения размера файла - это такая особенность почти во всех базах данных, для большей эффективности.
Но если уж надо подчистить… в 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()
Отредактировано (Июнь 7, 2008 01:53:21)
Офлайн
Ничего толком не увидел. Но если использовать потом
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()
- база заметно усыхает
Офлайн
Андрей Светлов
У меня не усыхает (WindowsXP, Python 2.5.2 ( Bdb 4.4.20))
Разобрался с подчисткой:
В нативном движке есть функция compact.
В биндинге к питону она не реализована, но исправить это недоразумение поможет патч (с перекомпиляцией):
http://bugs.python.org/issue1391
Отредактировано (Июнь 8, 2008 03:39:59)
Офлайн