python 中用于大数据存储的 ZODB 或其他数据库

ZODB or other database for large data storage in python

我使用 Zodb 存储大型数据,它采用典型的字典格式(键、值)形式。 但是在 ZODB 中存储时,我收到以下警告消息:

C:\python-3.5.2.amd64\lib\site-packages\ZODB\Connection. py:550: UserWarning: The object you're saving is large. (510241658 bytes.)

Perhaps you're storing media which should be stored in blobs.

Perhaps you're using a non-scalable data structure, such as a PersistentMapping or PersistentList.

Perhaps you're storing data in objects that aren't persistent at all. In cases like that, the data is stored in the record of the containing persistent object.

In any case, storing records this big is probably a bad idea.

If you insist and want to get rid of this warning, use the large_record_size option of the ZODB.DB constructor (or the large-record-size option in a configuration file) to specify a larger size.

warnings.warn(large_object_message % (obj.class, len(p)))

请建议我如何在 ZODB 中存储大数据或为此目的建议任何其他库

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

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

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

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

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

参考文献:

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

  2. 有用的库:

    一个。 z3c.blobfile(ZPL 许可)

    b。 plone.namedfile(BSD 许可)