1

为了持久性,我正在使用 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。

我在这里做错了吗?

4

2 回答 2

2

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

谷歌想出了这个邮件列表帖子

于 2009-08-26T15:48:57.503 回答
1

由于您在评论中询问了另一个存储系统,您可能想研究 SQLite。

尽管 SQLite 在先附加数据方面的行为相同,但它提供了 Vacuum 命令来恢复未使用的存储空间。在Python API中,您可以使用Vacuum pragma自动执行此操作,也可以只执行Vacuum 命令

于 2009-08-26T16:32:54.110 回答