2009-08-26 47 views
1

我正在使用ZODB来存储一些存储在内存中的数据以实现持久性。如果内存中的数据服务每次崩溃,重新启动将从ZODB加载数据,而不是查询MySQL数据库中成千上万行的数据。Python:ZODB文件大小不断增加 - 没有更新?

似乎每次我保存时,说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

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

+1

是否还有另一种存储系统(可能是python原生的),你可能会推荐,因为我想要做的就是每次覆盖存储的数据? Pickly会为我工作,但是当我拥有一大组数据(字典中的1M +条目)时,交易显得很慢 – sberry 2009-08-26 15:58:00

+0

像Mark说的那样,我会考虑sqlite。 – 2009-08-26 19:41:32

1

由于您在评论中询问了另一个存储系统,您可能需要查看SQLite。

即使SQLite在追加到数据时的行为相同,它也会提供vacuum命令来恢复未使用的存储空间。从Python API中,您可以使用vacuum pragma自动执行此操作,也可以执行the vacuum command

+0

嗯。 SQLite并不总是增加数据库文件的大小。空的页面被重用。只是这个文件不会缩小,除非你运行'vacuum'命令。 – tzot 2009-09-16 03:05:23