2015-04-01 59 views
1

我测试了ZODB通过创建一个巨大的对象,提交,然后它给了一个警告。 接下来,我开始从根目录中删除对象,提交。 .fs文件在空间上仍然是1GB。然后我杀死了REPL。我重新打开python,建立了连接,但现在我似乎无法摆脱这个1 GB文件(除了试图从磁盘本身删除它)。ZODB不释放硬盘空间

代码是这样的:

storage = FileStorage('Data.fs') 
db = DB(storage) 
connection = db.open() 
root = connection.root() 

通过创建一些巨大的物体其次,起初我确实是

root['bigObj'] = 'small_str', 
transaction.commit() 

,试图覆盖。之后我刚刚删除了键/值。

我缺少什么部分?

回答

2

ZODB是追加数据库。 ZODB不会回收或覆盖旧信息,除非明确告知。这意味着如果需要,您可以创建数据库的无限撤消历史记录。

要回收您需要的磁盘空间pack ZODB database

其他数据库(MySQL,PostgreSQL)具有相似的特征。例如,PostgreSQL必须不时更新。

+0

顺便说一句,我保持一个列表,我分享的线程。这对ZODB来说非常简单,但是这个列表变化很大。考虑到这种只能追加的情况,你是否可以提供一些建议(可能这不是一个好主意)? – PascalVKooten 2015-04-01 21:49:06

+0

ZODB不应该成为大多数用例的问题 - 如果您正在使用本机ZODB列表,那么它应该在每次更新时只写入数据库的增量(尽管我需要确认这一点)。请参阅http://zodborg.readthedocs.org/en/latest/documentation/guide/modules.html#persistent-list-persistentlist - 使用PersistentList而不是[]。这就是ZODB的工作原理 - 你无法改变野兽的本质。如果你需要处理大的,可变的blob,我建议你考虑替代数据库。这里有一种在PostgreSQL上类似ZODB行为的方法https://github.com/Shoobx/pjpersist – 2015-04-01 22:33:44

+0

@PascalvKooten:有一些ZODB后端可以配置为丢弃历史版本; 'RelStorage'可以做到这一点。然而,默认的'FileStorage'后端不能。 – 2015-04-02 09:30:28