ZODB или другая база данных для хранения больших данных в python

Я использовал Zodb для хранения больших данных в форме типичного словарного формата (ключ, значение). Но при сохранении в ZODB я получил следующее предупреждающее сообщение:

C:\python-3.5.2.amd64\lib\site-packages\ZODB\Connection. py:550: UserWarning: объект, который вы сохраняете, большой. (510241658 байт.)

Возможно, вы храните носитель, который должен храниться в больших двоичных объектах.

Возможно, вы используете немасштабируемую структуру данных, такую ​​как PersistentMapping или PersistentList.

Возможно, вы храните данные в объектах, которые вообще не являются постоянными. В таких случаях данные сохраняются в записи содержащего персистентного объекта.

В любом случае, хранить такие большие записи, вероятно, плохая идея.

Если вы настаиваете и хотите избавиться от этого предупреждения, используйте параметр large_record_size конструктора ZODB.DB (или параметр large-record-size в файле конфигурации), чтобы указать больший размер.

warnings.warn(large_object_message % (obj.класс, len(p)))

пожалуйста, предложите, как я могу хранить большие данные в ZODB или предложите любую другую библиотеку для этой цели


person WAS    schedule 11.11.2016    source источник


Ответы (2)


Используйте встроенную поддержку BLOB в ZODB для хранения больших данных; все остальное является анти-шаблоном, если только у вас нет потребности в каком-либо облачном хранилище для конкретного приложения, которое не может поддерживаться в локальной файловой системе.

Вы не сказали, что вы храните или как выглядит ваша конфигурация хранилища, но я думаю, что это инвариантно к правильному подходу: используйте BLOB.

Как это работает: Blob API хранит объекты, используя OID объекта-оболочки Persistent (на который обычно ссылаются как на атрибут вашего основного сохраняемого объекта). OID (внутренний идентификатор объекта ZODB) объекта-оболочки используется в качестве ключа для поиска данных BLOB, их извлечения и т. д. из настроенного хранилища BLOB.

Обычно это просто файл в файловой системе вашего приложения, но он также может храниться в файловой системе вашего сервера базы данных (ZEO или RDBMS за RelStorage, в зависимости от конфигурации). Возможно, что некоторые базы данных (например, серверная часть PostgreSQL для RelStorage) могут хранить BLOB, используя свои собственные механизмы хранения BLOB, которые ZODB (через RelStorage) разгружает.

Использованная литература:

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

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

  3. Полезные библиотеки:

    а. z3c.blobfile (лицензия ZPL)

    б. plone.namedfile (лицензия BSD)

person sdupton    schedule 11.11.2016
comment
@WAS Я должен упомянуть, что сейчас вы храните действительно большие огурцы, которые должны быть загружены все сразу и не могут передаваться в потоковом режиме. Для таких вещей, как запросы диапазона HTTP (прогрессивная потоковая передача), это стопор шоу; люди, использующие ZODB в больших производственных приложениях, используют BLOB-объекты, а затем обычно передают потоковую передачу данных файла на какой-либо итератор хранилища файлов, который работает с вашим веб-/сетевым приложением. Это очень хорошо работает для Zope 2, но есть также некоторые подходы, которые приложения могут использовать для использования таких вещей, как X-Sendfile, непосредственно с внешнего веб-сервера, минуя приложение, чтобы перейти прямо к BLOB. - person sdupton; 11.11.2016

Вы должны сохранить объект в файловой системе и добавить ссылку на него в zodb, как при использовании обычной базы данных.

person amirouche    schedule 11.11.2016
comment
можешь уточнить? - person WAS; 11.11.2016
comment
Это почти ответ. ZODB имеет API BLOB, правильный способ ссылаться и загружать данные BLOB. Использование других видов ссылок на файлы, скорее всего, является антишаблоном. - person sdupton; 11.11.2016