Написание хранилища ключей - PullRequest
12 голосов
/ 14 ноября 2009

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

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

Ответы [ 7 ]

21 голосов
/ 14 ноября 2009

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

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

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

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

4 голосов
/ 14 ноября 2009

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

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

3 голосов
/ 14 ноября 2009

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

Вот привязки к нему Python http://www.jcea.es/programacion/pybsddb.htm

3 голосов
/ 14 ноября 2009

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

2 голосов
/ 14 ноября 2009

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

1 голос
/ 08 июля 2016

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

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

0 голосов
/ 05 марта 2011

Прежде всего, я знаю этот вопрос довольно старый.

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

...