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

1 投票
2 回答
618 浏览
提问于 2025-04-15 13:53

我正在使用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()

我想不断地用我当前的字典值来覆盖root['data_db']中的数据。当我打印len(root['data_db'] )时,它总是显示我字典中正确的项目数量,但每次这段代码运行时(数据完全相同),文件大小都会增加500K。

我是不是做错了什么?

2 个回答

1

因为你在评论中提到想了解其他存储系统,所以我建议你看看SQLite。

虽然SQLite在添加数据时的表现和其他系统一样,但它有一个叫做“vacuum”的命令,可以用来回收未使用的存储空间。你可以通过Python的API来使用这个功能。你可以选择使用vacuum pragma来自动处理,或者直接执行vacuum命令

2

当ZODB里的数据发生变化时,新数据会被添加到文件的末尾,而旧的数据则会留在那儿。为了减小文件的大小,你需要手动“打包”数据库。

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

撰写回答