【问题标题】:ZODB does not release hard-disk spaceZODB 不释放硬盘空间
【发布时间】:2015-04-01 21:30:35
【问题描述】:

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

代码如下:

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

随后创建了一些巨大的对象,一开始我确实做到了

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

尝试覆盖。之后我只是删除了键/值。

我错过了什么?

【问题讨论】:

    标签: python python-3.x zope zodb


    【解决方案1】:

    ZODB 是仅附加数据库。 ZODB 从不回收或覆盖旧信息,除非明确告知这样做。这意味着如果需要,您可以在创建数据库之前拥有无限的撤消历史记录。

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

    其他数据库(MySQL、PostgreSQL)也有类似的特点。例如,PostgreSQL 必须不时被VACUUMed。

    【讨论】:

    • 顺便说一句,我正在维护一个我在线程之间共享的列表。 ZODB 真的很简单,但是这个列表变化很大。考虑到这种仅附加的情况,您对此有何建议(可能不是一个好主意)?
    • ZODB 对于大多数用例来说应该不是问题——如果您使用的是本机 ZODB 列表,那么它应该在每次更新时只将增量写入数据库(尽管我需要确认)。请参阅zodborg.readthedocs.org/en/latest/documentation/guide/… - 使用 PersistentList 而不是 []。这就是 ZODB 的工作方式——你真的无法改变野兽的本性。如果您需要处理大型、可变的 blob,我建议您考虑替代数据库。这是 PostgreSQL 上类似 ZODB 行为的一种方法github.com/Shoobx/pjpersist
    • @PascalvKooten:有 ZODB 后端可以配置为丢弃历史修订; RelStorage 可以做到这一点。但是默认的FileStorage 后端不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2019-01-15
    相关资源
    最近更新 更多