代码之家  ›  专栏  ›  技术社区  ›  sberry

python:zodb文件大小在增长-没有更新?

  •  1
  • sberry  · 技术社区  · 15 年前

    为了持久性,我使用zodb来存储内存中存在的一些数据。如果在内存中保存数据的服务每次崩溃,重新启动将从zodb加载数据,而不是在一个mysql db中查询成千上万行。

    似乎每次我将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的当前值连续覆盖根['data_db']中的数据。当我打印len(root['data_db'])时,它总是从mydictionary中打印正确数量的项目,但每次运行此代码(使用相同的精确数据)时,文件大小都会随着数据大小而增加,在本例中为500k。

    我在这里做错什么了吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Matthew Marshall    15 年前

    当zodb中的数据更改时,它将被附加到文件的末尾。旧数据留在那里。要减少文件大小,需要手动“打包”数据库。

    谷歌想出了 this mailing list post .

        2
  •  1
  •   Mark Rushakoff    15 年前

    因为您在注释中询问了另一个存储系统,所以可能需要查看sqlite。

    尽管sqlite在首先附加到数据时的行为相同,但它提供了真空命令来恢复未使用的存储空间。从 Python API ,您可以使用 vacuum pragma 自动执行,或者只需执行 the vacuum command .