我注意到ZODB.DB有一个“large_record_size”选项,我把它作为在ZODB中存储长文本的可能性。
我第一次尝试存储文本语料库(该语料库的总大小为59.1 MB,6000文本和最长文本的长度为82 KB),并将“large_record_size”选项设置为16777216,我开始只是使用connection.root(),并发出一个警告,报告根PersistentMapping的大小,并说存储这么大的对象可能是一个坏主意。
然后我尝试使用OOBTree来存储相同数量的文本。这次没有警告。生成的数据库文件为59.2 MB,非常小。我通过随机检索其中的文本来测试此文件。顺便说一句,检索速度相当快。显然,一切都是我想要的。但是,我是编程的新手,我认为我没有足够的理解做出安全的判断。
ZODB是一个存储文本的合适解决方案吗?
任何建议都将不胜感激。
答案 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对象。