Python:ZODB文件大小增长 - 不更新?

时间:2009-08-26 15:34:53

标签: python zodb

为了保持持久性,我使用ZODB来存储内存中存在的一些数据。如果内存中的数据服务每次崩溃,重新启动将从ZODB加载数据,而不是在MySQL数据库中查询数千行中的数百行。

似乎每次保存时,向我的数据库文件说500K数据,我的.fs文件增长500K,而不是保持在500K。举个例子:

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

我想用mydictionary的当前值连续覆盖root ['data_db']中的数据。当我打印len(root ['data_db'])时,它始终从mydictionary打印正确数量的项目,但每次运行此代码(具有相同的确切数据)时,文件大小会增加数据大小,在本例中为500K。

我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

当ZODB中的数据发生变化时,它会附加到文件末尾。旧数据留在那里。要减少文件大小,您需要手动“打包”数据库。

Google想出了this mailing list post

答案 1 :(得分:1)

由于您在评论中询问了其他存储系统,因此您可能需要查看SQLite。

尽管SQLite在首先附加数据时的行为相同,但它提供了vacuum命令来恢复未使用的存储空间。从Python API开始,您可以使用vacuum pragma自动执行此操作,也可以只执行the vacuum command