13

我正在寻找编写一个键/值存储(可能在 python 中),主要是为了体验,因为我认为这是一个非常有用的产品。我有一些问题。一般来说,键/值对通常如何存储在内存和磁盘中?如何将存储在磁盘上的内容加载回内存?键/值存储是否一次将所有键/值对保存在内存中?还是从磁盘读取?

我试图找到一些关于这个主题的文献,但没有走得很远,希望这里有人能帮助我。

4

7 回答 7

24

It all depends on the level of complexity you want to dive into. Starting with a simple Python dict serialized to a file in a myriad of possible ways (of which pickle is probably the simplest), you can go as far as implementing a complete database system.

Look up redis - it's a key/value store written in C and operating as a server "DB". It has some good documentation and easy to read code, so you can borrow ideas for your Python implementation.

To go even farther, you can read about B-trees.

For your specific questions: above some DB size, you can never keep it all in memory, so you need some robust way of loading data from disk. Also consider whether the store is single-client or multi-client. This has serious consequences for its implementation.

于 2009-11-14T08:44:52.497 回答
4

看看shelve提供持久字典的 Python 模块。它基本上将泡菜存储在数据库中,通常是 dmb 或 BSDDB。看看shelve工作原理会给你一些见解,源代码随你的 python 发行版一起提供。

另一个值得关注的产品是Durus。这是一个对象数据库,它使用自己的 B-tree 实现来持久化到磁盘。

于 2009-11-14T09:05:38.930 回答
3

如果您出于学习目的在 Python 中进行键/值存储,那么从pickle模块开始可能是最简单的。这是一种将任意 Python 数据流写入持久存储并再次读回的快速便捷方式。

于 2009-11-14T07:53:43.007 回答
3

你可以看看“ Berkley db ”,看看它是如何工作的,它是一个键/值数据库,所以你可以直接使用它,或者因为它是开源的,所以看看它如何处理大多数的持久性、事务和分页引用的页面。

这里是 python 绑定它http://www.jcea.es/programacion/pybsddb.htm

于 2009-11-14T08:05:42.827 回答
2

亚马逊发布了一份关于 Dynamo 的文档——一个高可用的键值存储系统。它主要处理扩展问题(如何创建在大量机器上运行的键/值存储),但它也处理一些基础知识,通常值得一读。

于 2009-11-14T08:35:59.270 回答
1

首先,我知道这个问题很老了。

我是 aodbm ( http://sf.net/projects/aodbm/ ) 的创建者,它是一个键值存储库。aodbm 使用不可变的 B+Trees 来存储您的数据。因此,每当进行修改时,都会在文件末尾附加一棵新树。这听起来可能是一种可怕的空间浪费,但鉴于前一棵树中的绝大多数节点都被引用,因此开销实际上非常低。在任何给定时间(最多 O(log n)),整个树中只有很少一部分保存在内存中。

于 2011-03-04T21:07:42.647 回答
1

我建议看一下外部内存数据结构中的写入优化幻灯片),它很好地概述了构建额外内存数据库(例如键值存储)的现代方法,并解释了日志结构的合并树

如果您的键值存储针对所有数据都适合主内存的用例,那么数据存储架构可能会简单得多,将文件映射到一大块内存并使用该内存而无需担心磁盘到内存通信和同步,因为它成为操作系统的关注点。

于 2016-07-08T15:50:57.060 回答