Написание хранилища ключей

Я хочу написать хранилище ключей/значений (возможно, на python), в основном, только для опыта, и потому что это то, что я считаю очень полезным продуктом. У меня есть несколько вопросов. Как, в общем, пары ключ/значение, обычно хранящиеся в памяти и на диске? Как можно загружать вещи, хранящиеся на диске, обратно в память? Хранили ли хранилища ключей/значений все пары ключ/значение в памяти одновременно? или он читается с диска?

Я попытался найти литературу по этому вопросу, но не очень далеко и надеялся, что кто-то здесь может помочь мне.

Ответ 1

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

Посмотрите redis - это хранилище ключей/значений, написанное на C и работающее как сервер "DB". Он имеет хорошую документацию и легко читаемый код, поэтому вы можете брать идеи для своей реализации Python.

Чтобы идти еще дальше, вы можете прочитать о B-деревьях.

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

Ответ 2

Посмотрите на модуль Python shelve, который предоставляет постоянный словарь. Он в основном хранит соленые огурцы в базе данных, обычно dmb или BSDDB. Глядя на то, как работает shelve, вы получите некоторые идеи, а исходный код - с вашим дистрибутивом python.

Еще один продукт, который нужно посмотреть, - Durus. Это объектная база данных, в которой она использует собственную реализацию B-дерева для сохранения на диске.

Ответ 3

Если вы делаете хранилище ключей/значений в Python для обучения, это может быть проще всего начать с pickle модуль. Это быстрый и удобный способ записи произвольного потока данных Python в постоянное хранилище и его повторного чтения.

Ответ 4

вы можете взглянуть на Berkley db ', чтобы увидеть, как это работает, это ключ/ценность DB, поэтому вы может использовать его напрямую или, как он является открытым исходным кодом, видеть, как он обрабатывает постоянство, транзакции и поисковый вызов наиболее часто используемых страниц.

здесь привязки python к нему http://www.jcea.es/programacion/pybsddb.htm

Ответ 5

Amazon выпустила документ о Dynamo - высокодоступной системе хранения ключей. В основном это касается проблем масштабирования (как создать хранилище ключей/значений, которое выполняется на большом количестве машин), но также имеет дело с некоторыми основными принципами и, как правило, стоит прочитать.

Ответ 6

Сначала я знаю, что этот вопрос довольно старый.

Я создатель aodbm (http://sf.net/projects/aodbm/), который является библиотекой хранилища ключей. aodbm использует неизменные B + деревья для хранения ваших данных. Поэтому всякий раз, когда делается модификация, новое дерево добавляется к концу файла. Это, вероятно, звучит как ужасная трата пространства, но, наблюдая за тем, как подавляющее большинство узлов из предыдущего дерева ссылаются, накладные расходы на самом деле довольно низки. Очень мало всего дерева хранится в памяти в любой момент времени (не более O (log n)).

Ответ 7

Рекомендую посмотреть разговор Оптимизация записи в структурах данных внешней памяти (slides), который дает хороший обзор современных подходов к созданию баз данных дополнительной памяти (например, хранилищ для ключей) и объясняет log-structured merge trees.

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