ZODB可以处理文本的“large_record_size”

时间:2013-10-25 18:50:25

标签: python zodb

我注意到ZODB.DB有一个“large_record_size”选项,我把它作为在ZODB中存储长文本的可能性。

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

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

ZODB是一个存储文本的合适解决方案吗?

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分: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或将数据拆分为较小的持久性记录,因为对大型同类记录的更改将在提交时导致巨大的流失。请参阅我之前的答案:when to commit data in ZODB

警告是针对PersistentMapping发出的,因为它会将所有键和值存储在一个记录中。这里没有文本文档的个别大小,它是所有文本文档的大小(所有文本文档)在这里触发警告。

将文本文档存储在PersistentMapping中作为Persistent的子类(以便值在ZODB中获取自己的记录),或者使用{{1对象。

请参阅Advanced ZODB for Python Programmers