1

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

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

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

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

任何建议将不胜感激。

4

1 回答 1

0

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

当数据记录很大时,会发出警告,以防止新用户在脚下开枪。

>>> 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<<30或 1GB。

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

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

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

请参阅适用于 Python 程序员的高级 ZODB

于 2013-10-25T18:54:59.110 回答