21

我听说 B-Tree 数据库比 Hash 表快,所以我想在我的项目中使用 B-Tree 数据库。python中是否有任何现有框架允许我们使用这种数据结构,或者我必须从头开始编码?

4

6 回答 6

30

选择 B-Tree 而不是哈希表的唯一原因,无论是在内存中还是在块存储中(如在数据库中),都是为了支持不相等的查询。b 树允许您以良好的性能执行范围查询。但是,许多键值对存储(例如 berkley db)并没有使其在外部可见,因为它们仍然散列键,但这仍然可以让您快速稳定地迭代整个数据集(即使有添加迭代器仍然有效或删除,或者必须重新平衡树)。

如果你不需要范围查询,也不需要并发迭代,那么你就不需要 b-trees,使用哈希表,在任何规模下都会更快。

编辑:我有机会让上述内容成为现实;为此,该blist包似乎是排序容器库的最完整实现。

于 2010-10-12T02:24:58.867 回答
4

你真的应该看看zodb。 http://www.zodb.org/en/latest/

我做了一本关于它的专着,虽然它是西班牙语http://sourceforge.net/projects/banta/files/Labs/zodb/Monografia%20-%20ZODB.pdf/download

英文信息到处都是。

于 2014-08-01T14:56:49.153 回答
3

首先对您尝试做的事情进行编程,然后在需要时进行优化。时期。

编辑:

http://pypi.python.org/pypi/blist

替换 python 的内置列表。

于 2010-10-11T20:18:53.943 回答
2

这里有一个很好的 btree 纯 python 实现。如果需要,您可以对其进行调整。

于 2011-09-10T13:11:55.480 回答
2

SQLite3 在内部使用 B+ 树,但听起来您可能想要一个键值存储。试试 Berkeley DB。如果您不需要事务,请尝试 HDF5。如果你想要一个分布式键值存储,还有http://scalien.com/keyspace/,但这是一个服务器-客户端类型的系统,可以打开各种 NoSQL 键值存储。

所有这些系统的插入和检索都将是 O(log(n)),因此它们可能会比您当前使用的哈希表慢。

京都内阁提供了一个哈希树,所以这可能是您正在查看的更多内容,因为它应该是 O(1) 用于插入和检索,但是如果您需要,您不能进行按顺序遍历(尽管因为您'当前正在使用哈希树,这应该不是问题)。

http://fallabs.com/kyotocabinet/

如果您正在寻找性能,您将需要在编译语言中实现速度关键项目,然后在 Python 中使用包装器 API。

于 2010-10-12T01:26:41.817 回答
2

您可能想看看mxBeeBase,它是 eGenix mx Base Distribution 的一部分。它包括一个快速的磁盘 B+Tree 实现,并提供允许在 Python 中构建磁盘字典或数据库的存储类。

于 2011-05-26T22:52:01.067 回答