Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 6, 2008 20:38:26

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

bsddb

Начал разбираться с bsddb.
Хочу использовать ее для синхронизации между собой нескольких копий веб-приложения.
Не могу сообразить по поводу двух моментов:
1. как сделать чтоб файл подчистился (или как это называется) (или может автоподчистка какая есть), после того как из него данные удаляешь.
2. Как организовать транзакции?
3. как сдать такую штуку: надо записать что-то с ключом, но если такой ключ уже есть в базе - надо как-то узнать об этом (какое-то исключение должно генерироваться (?)



Отредактировано (Июнь 6, 2008 20:45:31)

Офлайн

#2 Июнь 6, 2008 20:52:46

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

bsddb

с вопросом 3 - разобрался =)
надо делать put с флагом db.DB_NOOVERWRITE



Офлайн

#3 Июнь 6, 2008 22:05:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

bsddb

Новый стиль есть в bsddb.db для python 2.5. Транзакции в том числе.
Документация здесь: http://pybsddb.sourceforge.net/bsddb3.html

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



Офлайн

#4 Июнь 6, 2008 22:23:04

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

bsddb

Андрей Светлов
SQLite я знаю и пользовать умею.
Но хочу попробовать и bsddb. В нкоторых случаях мне он кажется более оптимальным выбором (правда пока не разобрался с ним, трудно сказать в каких %) ).

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



Отредактировано (Июнь 6, 2008 22:28:04)

Офлайн

#5 Июнь 7, 2008 00:21:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

bsddb

транзакции - как обычно

tx = dbenv.txn_begin()

try:

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

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

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



Офлайн

#6 Июнь 7, 2008 01:40:39

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

bsddb

Андрей Светлов
Насчет транзакций - спасибо. Сразу все стало на свои места.


Насчет неуменьшения размера файла - это такая особенность почти во всех базах данных, для большей эффективности.
Но если уж надо подчистить… в 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)

Офлайн

#7 Июнь 8, 2008 02:23:39

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

bsddb

Ничего толком не увидел. Но если использовать потом

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()

- база заметно усыхает



Офлайн

#8 Июнь 8, 2008 03:31:48

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

bsddb

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

Разобрался с подчисткой:
В нативном движке есть функция compact.
В биндинге к питону она не реализована, но исправить это недоразумение поможет патч (с перекомпиляцией):
http://bugs.python.org/issue1391



Отредактировано (Июнь 8, 2008 03:39:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version