Python: размер файла ZODB увеличивается, а не обновляется? - PullRequest
1 голос
/ 26 августа 2009

Я использую ZODB для хранения некоторых данных, которые существуют в памяти ради постоянства. Если каждый раз происходит сбой службы с данными в памяти, перезапуск будет загружать данные из ZODB, а не запрашивать сотни тысяч строк в базе данных MySQL.

Кажется, что каждый раз, когда я сохраняю, скажем, 500 КБ данных в файл базы данных, мой файл .fs увеличивается на 500 КБ, а не остается на 500 КБ. Как пример:

storage     = FileStorage.FileStorage(MY_PATH)
db          = DB(storage)
connection  = db.open()
root        = connection.root()

if not root.has_key('data_db'):
    root['data_db'] = OOBTree()
mydictionary = {'some dictionary with 500K of data'}
root['data_db'] = mydictionary
root._p_changed = 1
transaction.commit()
transaction.abort()
connection.close()
db.close()
storage.close()

Я хочу непрерывно перезаписывать данные в корне ['data_db'] текущим значением mydictionary. Когда я печатаю len (root ['data_db']), он всегда печатает правильное количество элементов из mydictionary, но каждый раз, когда этот код запускается (с такими же точными данными), размер файла увеличивается на размер данных, в данном случае 500K.

Я что-то здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

Когда данные в ZODB изменяются, они добавляются в конец файла. Старые данные остались там. Чтобы уменьшить размер файла, вам нужно вручную «упаковать» базу данных.

Google придумала это сообщение в списке рассылки .

1 голос
/ 26 августа 2009

Поскольку вы спросили о другой системе хранения в комментарии, возможно, вы захотите взглянуть на SQLite.

Несмотря на то, что SQLite ведет себя так же при первом добавлении данных, он предлагает команду вакуума для восстановления неиспользуемого пространства хранения. Из Python API вы можете либо использовать вакуумную прагму , чтобы сделать это автоматически, либо просто выполнить вакуумную команду .

...