为了保持持久性,我使用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。
我在这里做错了吗?
答案 0 :(得分:2)
当ZODB中的数据发生变化时,它会附加到文件末尾。旧数据留在那里。要减少文件大小,您需要手动“打包”数据库。
Google想出了this mailing list post。
答案 1 :(得分:1)
由于您在评论中询问了其他存储系统,因此您可能需要查看SQLite。
尽管SQLite在首先附加数据时的行为相同,但它提供了vacuum命令来恢复未使用的存储空间。从Python API开始,您可以使用vacuum pragma自动执行此操作,也可以只执行the vacuum command。