Можно ли незаметно реализовать список, набор или словарь Python с помощью базы данных? - PullRequest
11 голосов
/ 11 июля 2011

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

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

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

Как вы, мистер или миссис Python Super Expert?иметь дело со списками, наборами и диктовками при увеличении объема данных?

Ответы [ 3 ]

8 голосов
/ 11 июля 2011

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

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

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

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

2 голосов
/ 11 июля 2011

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

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

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

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

0 голосов
/ 11 июля 2011

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

...