Может ли список, набор или словарь Python быть реализован невидимо с помощью базы данных?

Возможности Python для списков, наборов и словарей полностью скалываются. Есть ли способ продолжить использование собственной возможности, когда данные становятся действительно большими? Проблема, над которой я работаю, связана с сопоставлением (пересечением) очень больших списков. Я еще не подтолкнул ограничения - на самом деле я не знаю, каковы ограничения, и не хочу удивляться большой повторной реализации после того, как данные будут расти, как ожидалось.

Разумно ли развертывать на чем-то вроде Google App Engine, который не рекламирует практические ограничения по масштабу и продолжает использовать собственные возможности как есть навсегда и не думает об этом?

Есть ли какая-то магия Python, которая может скрыть, находится ли список, набор или словарь в управляемой Python памяти или в БД, - так физическое развертывание данных может отличаться от того, что я делаю в коде?

Как вы, г-н или г-жа Python Super Expert, имеете дело со списками, наборами и dicts по мере роста объема данных?

Ответ 1

Я не совсем уверен, что вы подразумеваете под собственными возможностями для списков, наборов и словарей. Однако вы можете создавать классы, которые эмулируют типы контейнеров и типы последовательностей путем определения методов со специальными именами. Это означает, что вы можете создать класс, который ведет себя как список, но сохраняет свои данные в базе данных SQL или в хранилище данных GAE. Проще говоря, это то, что делает ORM. Однако сопоставление объектов с базой данных очень сложно, и, вероятно, не рекомендуется придумывать свой собственный ORM, но использовать уже существующий.

Я боюсь, что нет единого решения для всех. Особенно GAE - это не какая-то волшебная пылинка, которую вы можете посыпать своим кодом, чтобы сделать его масштабным. Есть несколько ограничений, которые вы должны иметь в виду, чтобы создать приложение, которое может масштабироваться. Некоторые из них являются общими, например вычислительная сложность, другие относятся к среде, в которой работает ваш код. на GAE максимальное время отклика ограничено 30 секундами, а запрос к хранилищу данных отличается от других баз данных.

Трудно дать какой-либо конкретный совет, не зная вашей конкретной проблемы, но я сомневаюсь, что GAE - правильное решение.

В общем, если вы хотите работать с большими наборами данных, вам либо нужно помнить об этом с самого начала, либо вам придется переделывать свой код, алгоритмы и структуры данных по мере роста наборов данных.

Ответ 2

Вы описываете мои мечты! Однако, я думаю, вы не сможете этого сделать. Я всегда хотел что-то вроде LINQ для Python, но язык не позволяет использовать синтаксис Python для собственных операций с базами данных AFAIK. Если бы это было возможно, вы могли бы просто написать код, используя списки, а затем использовать тот же код для извлечения данных из базы данных.

Я бы не рекомендовал вам писать много кода, основанного только на списках и наборах, потому что переносить его на масштабируемую платформу будет непросто. Я рекомендую вам использовать что-то вроде ORM. GAE даже свою собственную ORM-подобную систему, и вы можете использовать другие, такие как SQLAlchemy и SQLObject, например SQLite.

К сожалению, вы не можете использовать потрясающие вещи, такие как списки, чтобы фильтровать данные из базы данных. Разумеется, вы можете фильтровать данные после того, как они были получены из БД, но вам все равно нужно построить запрос с некоторым SQL-подобным языком для запроса объектов или возврата большого количества объектов из базы данных.

OTOH, есть Buzhug, любопытная нереляционная система баз данных, написанная на Python, которая позволяет использовать естественный синтаксис Python. Я никогда не использовал его, и я не знаю, является ли он масштабируемым, поэтому я не буду вкладывать свои деньги в него. Тем не менее, вы можете проверить его и посмотреть, может ли он вам помочь.

Ответ 3

Вы можете использовать ORM: Реляционное сопоставление объектов: класс получает таблицу, объекты получают строку. Мне нравится Django ORM. Вы можете использовать его и для не-веб-приложений. Я никогда не использовал его на GAE, но я думаю, что это возможно.