2016-11-11 108 views
2

我正在使用Zodb作为典型字典格式(键,值)形式的大型数据存储。 但是,尽管ZODB存储我得到以下警告消息:ZODB或其他数据库在python中的大型数据存储

C:\中的python-3.5.2.amd64 \ LIB \站点包\ ZODB \连接。 py:550: UserWarning:您保存的对象 很大。 (510241658字节)。

也许你正在存储应该存储在blob中的媒体。

也许您正在使用不可扩展的数据结构,如 PersistentMapping或PersistentList。

也许你正在将数据存储在根本不持久的对象中。 在这种情况下,数据存储在包含持久对象的记录中。

无论如何,存储这个大记录可能是一个坏主意。

如果你坚持,并希望摆脱这种警告,使用ZODB.DB构造函数(或在配置文件中的 大记录大小选项)的 large_record_size选项来指定一个更大的 大小。

warnings.warn(large_object_message%(OBJ。,LEN(P)))

请建议我如何能庞大的数据存储在ZODB或建议任何其他库用于这一目的

回答

1

在ZODB中使用原生BLOB支持来存储大数据;其他任何东西都是反模式,除非您对本地文件系统无法支持的某种云存储有一些特定于应用程序的需求。

你还没有说过你正在存储什么或者你的存储配置是什么样的,但我认为这是正确的方法不变的:使用BLOB。

工作原理:Blob API存储使用包装持久对象(通常被引用为主要持久对象的属性)的OID的对象。包装对象的OID(内部ZODB对象ID)用作键,用于查找BLOB数据,从配置的BLOB存储中获取等。

通常这只是应用程序文件系统上的一个文件,但也可能存储在数据库服务器的文件系统中(ZEO或RDBMS位于RelStorage之后,具体取决于配置)。某些数据库(例如PostgreSQL后端到RelStorage)可以使用其本地BLOB存储机制来存储BLOB,而ZODB(通过RelStorage)将其卸载到本地BLOB存储机制。

参考文献:

  1. https://ziade.org/2007/09/14/to-blob-or-not-to-blob/

  2. https://stackoverflow.com/a/14645205/835961

  3. 有用的库:

    一个。 z3c.blobfile(ZPL授权)

    b。 plone.namedfile(BSD授权)

+1

@WAS我应该提到,你现在在做的是存储真正的大酱菜,它们必须一次加载并且不能流式传输。对于像HTTP范围请求(渐进式流式传输)这样的节目来说,在大型生产应用中使用ZODB的人们使用BLOB,然后通常将文件数据流传输到某个文件存储迭代器,该迭代器可与Web /网络应用程序一起工作。这对于Zope 2非常适用,但也有一些应用程序可能需要使用一些方法,例如直接从前端Web服务器使用X-Sendfile来绕过应用程序直接访问BLOB。 – sdupton

1

您必须将对象存储在文件系统中,并像使用常规数据库一样在zodb中添加对其的引用。

+0

你能否详细说明一下? – WAS

+0

这是一个“几乎”的答案。 ZODB有一个BLOB API,是引用和加载BLOB数据的正确方式。对文件使用其他类型的“引用”可能是反模式。 – sdupton

相关问题