Сравнение решений для постоянного хранения в Python - PullRequest
11 голосов
/ 06 августа 2009

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

  • Скорость. Я не могу загрузить все данные с диска каждый раз, когда запускаю новый скрипт, и я хотел бы получить как можно более быстрый доступ к произвольным записям.
  • Простота в использовании. Это питон. Хранилище должно выглядеть как python.
  • Стабильность / зрелость. Я хотел бы что-то, что в настоящее время поддерживается, хотя что-то, что работает хорошо, но все еще находится в разработке, было бы хорошо.
  • Простота установки. Мой системный администратор должен запустить его в нашем кластере.

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

Некоторые потенциальные варианты, которые я начал изучать (см. этот пост):

Какие-нибудь предложения, какие из них могут быть лучше для моих целей? Есть идеи получше? У некоторых из них есть фон; какие-либо предложения по поводу какой файловой системы лучше всего подойдет?

Ответы [ 9 ]

13 голосов
/ 06 августа 2009

Возможно, вам захочется дать mongodb - библиотека PyMongo работает со словарями и поддерживает большинство типов Python. Прост в установке, очень производительный + масштабируемый. MongoDB (и PyMongo) также используется в производстве в некоторых громких именах.

8 голосов
/ 06 августа 2009

СУБД.

Нет ничего более реалистичного, чем использование таблиц в хорошо известной СУБД. Postgresql приходит на ум.

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

Это действительно быстро.

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

Используя sqlalchemy, вы можете оставить своему пользователю / sysadmin выбирать, какой сервер базы данных он хочет использовать. Возможно, они уже установили MySql - без проблем.

СУБД по-прежнему являются лучшим выбором для хранения данных.

5 голосов
/ 06 августа 2009

Я работаю над таким проектом и использую SQLite .

SQLite хранит все в одном файле и является частью стандартной библиотеки Python . Следовательно, установка и настройка практически бесплатны (простота установки).

Вы можете легко управлять файлом базы данных с помощью небольших скриптов Python или с помощью различных инструментов. Существует также плагин Firefox (простота установки / простота использования).

Мне очень удобно использовать SQL для фильтрации / сортировки / манипулирования / ... данными. Хотя я не эксперт по SQL. (Легкость в использовании)

Я не уверен, является ли SQLite самой быстрой системой БД для этой работы и в ней отсутствуют некоторые функции, которые могут вам понадобиться, например хранимые процедуры.

В любом случае, SQLite работает для меня.

4 голосов
/ 08 августа 2009

, если вам действительно нужно хранилище, похожее на словарь, некоторые из новых хранилищ ключей / значений или столбцов, таких как Cassandra или MongoDB, могут обеспечить гораздо большую скорость, чем с реляционной базой данных. Конечно, если вы решите использовать RDBMS, SQLAlchemy - это то, что вам нужно (отказ от ответственности: я его создатель), но ваш список желаемых функций, кажется, склоняется в направлении «Я просто хочу словарь, похожий на Python» - если вы не интересуются реляционными запросами или сильной ACIDity, эти аспекты RDBMS, вероятно, будут казаться громоздкими.

3 голосов
/ 06 августа 2009

Sqlite - поставляется с Python, быстрый, широко доступный и простой в обслуживании

2 голосов
/ 06 августа 2009

Если вам нужны только простые (подобные диктату) механизмы доступа и вам нужна эффективность для обработки большого количества данных, тогда HDF5 может быть хорошим вариантом. Если вы собираетесь использовать numpy, то это действительно стоит рассмотреть.

1 голос
/ 09 августа 2009

Это действительно зависит от того, что вы пытаетесь сделать. СУБД предназначена для реляционных данных , поэтому, если ваши данные являются реляционными, используйте один из различных вариантов SQL. Но, похоже, ваши данные больше ориентированы на хранилище значений ключей с очень быстрыми случайными операциями GET. Если это так, сравните тесты различных хранилищ ключей, сосредоточив внимание на скорости GET. Идеальное хранилище ключей-значений будет хранить или кэшировать запросы в памяти и иметь возможность обрабатывать многие запросы GET одновременно. Возможно, вы захотите создать свой собственный набор тестов, чтобы вы могли эффективно сравнивать случайные параллельные операции GET.

Зачем вам кластер? Размер каждого значения очень большой? Если нет, вам не нужен кластер для хранения миллиона записей. Но если вы храните большие блоки данных, это имеет значение, и вам может понадобиться что-то, что легко поддерживает чтение ведомых и / или прозрачное разбиение. Некоторые хранилища значений ключей ориентированы на документы и / или оптимизированы для хранения больших значений. Redis технически более эффективен для хранения для больших значений из-за затрат на индексацию, необходимых для быстрых GET, но это не обязательно означает, что он медленнее. Фактически, дополнительная индексация ускоряет поиск.

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

1 голос
/ 06 августа 2009

Совместная работа NEMO (создание детектора космических нейтрино под водой) имела много тех же проблем, и они использовали mysql и postgresql без серьезных проблем.

1 голос
/ 06 августа 2009

Go с СУБД надежно масштабируется и быстро.

Если вам нужно более масштабное решение и вам не нужны функции СУБД, вы можете воспользоваться хранилищем значений ключей, например couchdb, с хорошим API-интерфейсом Python.

...