Быстрое, доступное для поиска хранилище для Python - PullRequest
2 голосов
/ 21 июля 2009

В настоящее время я использую SQLite (w / SQLAlchemy ) для хранения около 5000 объектов dict. Каждый объект dict соответствует записи в PyPI с ключами - (имя, версия, сводка .. иногда «описание» может быть таким же большим, как проектная документация).

Запись этих записей (из JSON) обратно на диск (в формате SQLite) занимает несколько секунд и кажется медленной.

Запись производится так часто, как раз в день, но чтение / поиск определенной записи на основе ключа (обычно имени или описания) выполняется очень часто.

Так же, как apt-get.

Существует ли библиотека хранения для Python, которая будет лучше отвечать моим потребностям, чем SQLite?

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

Вы ставили индексы на имя и описание? Поиск по 5000 проиндексированных записей должен быть практически мгновенным (конечно, ORM сделают вашу жизнь намного сложнее, как они обычно делают [даже относительно хорошие, такие как SQLAlchemy, но попробуйте «raw sqlite», и он обязательно должен летать).

Запись только обновленных записей (опять же с реальным SQL) также должна быть в основном мгновенной - в идеале это должен делать один оператор обновления, но даже тысяча не должна быть реальной проблемой, просто обязательно отключите автокоммит в начале цикла (и, если вы хотите, снова включите его позже).

1 голос
/ 21 июля 2009

Это может быть излишним для вашего приложения, но вы должны проверить базы данных без схем / документов. Лично я фанат couchdb . По сути, вместо того, чтобы хранить записи в виде строк в таблице, что-то вроде couchdb хранит пары ключ-значение, а затем (в случае couchdb) вы пишете представления в javascript, чтобы отбирать нужные данные. Эти базы данных обычно легче масштабировать, чем реляционные базы данных, и в вашем случае это может быть намного быстрее, поскольку вам не нужно вбивать свои данные в форму, которая будет вписываться в реляционную базу данных. С другой стороны, это означает, что запущена другая служба.

0 голосов
/ 17 декабря 2010

Я сейчас решаю для себя очень похожую проблему, используя Nucular , которая может удовлетворить ваши потребности. Это хранилище на основе файловой системы, и оно действительно очень быстрое. (Он поставляется с примером приложения, которое индексирует все исходное дерево Python ). Оно безопасно для одновременной работы, не требует внешних библиотек и является чистым Python. Он выполняет быстрый поиск и обладает мощным полнотекстовым поиском, индексацией и т. Д. - своего рода специализированное, незавершенное, собственное хранилище Python-dict по образцу модных Couchdb и mongodb, но гораздо легче.

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

0 голосов
/ 03 марта 2010

Учитывая приблизительное количество указанных объектов (около 5000), SQLite, вероятно, не является проблемой скорости. Это посреднические меры; например, JSON или, возможно, неоптимальное использование SQLAlChemy.

Попробуйте это (довольно быстро даже для миллионов объектов): Модуль y_serial.py :: хранилище объектов Python с SQLite

"Сериализация + постоянство :: в несколько строк кода сжимают и аннотируют объекты Python в SQLite, а затем извлекают их в хронологическом порядке по ключевым словам без какого-либо SQL. Наиболее полезный" стандартный "модуль для базы данных для хранения данных без схемы . "

http://yserial.sourceforge.net

Поиск yserial по вашим ключам выполняется с помощью кода регулярного выражения ("regex") на стороне SQLite, а не на Python, так что есть еще одно существенное улучшение скорости.

Дайте нам знать, как это работает.

...