【问题标题】:Can ZODB handle "large_record_size" of textZODB 可以处理“large_record_size”的文本吗
【发布时间】:2013-10-26 03:00:50
【问题描述】:

我注意到 ZODB.DB 有一个“large_record_size”选项,我认为它可以在 ZODB 中存储长文本。

我第一次尝试存储文本语料库(这个语料库的总大小为 59.1 MB,6000 个文本,最长的长度为 82 KB),“large_record_size”选项设置为 16777216,我开始简单使用 connection.root(),并发出警告,报告根 PersistentMapping 的大小,并说存储这么大的对象可能是个坏主意。

然后我尝试使用 OOBTree 来存储相同的大量文本。这次没有警告。生成的数据库文件为 59.2 MB,非常小。我通过随机检索其中的文本来测试这个文件。顺便说一句,检索速度相当快。显然一切都是我想要的。但是,我是编程新手,我认为我没有足够的理解来做出安全的判断。

ZODB 是一个不错的文本存储解决方案吗?

任何建议都将不胜感激。

【问题讨论】:

    标签: python zodb


    【解决方案1】:

    该选项仅用于控制何时发出警告:

    当数据记录很大时,会发出警告以尝试防止新的 用户免于射击自己的脚。

    >>> db = ZODB.DB('t.fs', create=True)
    >>> conn = db.open()
    >>> conn.root.x = 'x'*(1<<24)
    >>> ZODB.tests.util.assert_warning(UserWarning, transaction.commit,
    ...    "object you're saving is large.")
    >>> db.close()
    

    large_record_size用于设置阈值,默认为1&lt;&lt;30,即1GB。

    超过此大小,您应该使用 ZODB Blob 或将数据拆分为较小的持久记录,因为对大型同质记录的更改会在提交时导致巨大的流失。请参阅我以前的答案:when to commit data in ZODB

    针对您的PersistentMapping 发出警告,因为它将所有键和值存储在一个记录中。这里计算的不是文本文档的单个大小,而是所有文本文档加在一起的大小(泡菜)触发了这里的警告。

    将您的文本文档作为Persistent 的子类存储在PersistentMapping 中(以便值在ZODB 中获得它们自己的 记录),或者使用BTree.OOBTree 对象。

    Advanced ZODB for Python Programmers

    【讨论】:

    • 感谢您非常彻底和非常有启发性的回答Martijin。我尝试了 blobs,但我放弃了使用它,因为检索性能有点差。我认为我需要找到一种方法来确定文本文档的长度太长,以避免“提交时出现巨大的流失”或其他任何事情。
    • @user2871934:然后为您的文本数据创建Persistent 的子类。 class TextDocument(Persistent): 并将 that 的实例存储在您的映射中。
    • @user2871934:然后每个文本文档在 ZODB 中都有自己的记录,PersistentMapping 父级只需存储键和对值记录的引用。
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多