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()
我想不断地用我当前的字典值来覆盖root['data_db']中的数据。当我打印len(root['data_db'] )时,它总是显示我字典中正确的项目数量,但每次这段代码运行时(数据完全相同),文件大小都会增加500K。
我是不是做错了什么?
2 个回答
1
因为你在评论中提到想了解其他存储系统,所以我建议你看看SQLite。
虽然SQLite在添加数据时的表现和其他系统一样,但它有一个叫做“vacuum”的命令,可以用来回收未使用的存储空间。你可以通过Python的API来使用这个功能。你可以选择使用vacuum pragma来自动处理,或者直接执行vacuum命令。
2
当ZODB里的数据发生变化时,新数据会被添加到文件的末尾,而旧的数据则会留在那儿。为了减小文件的大小,你需要手动“打包”数据库。
谷歌提出了这个邮件列表的帖子。