Python中有B-Tree数据库或框架吗?

Posted

技术标签:

【中文标题】Python中有B-Tree数据库或框架吗?【英文标题】:Is there a B-Tree Database or framework in Python? 【发布时间】:2011-04-24 00:02:58 【问题描述】:

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

【问题讨论】:

这是避免过早优化应用程序的好时机。只需获得一个工作应用程序,然后如果有必要,您就可以寻找提高性能的机会。顺便说一句,您可以随时尝试将“python b-tree”放入 Google 以回答您的问题。 好吧,我确实有我的应用程序的原型,但问题是我必须处理的数据集实际上接近百万,传统的散列无法让我获得如此高的速度..所以想到冒险到 B 树。 所有反对票是怎么回事? (我投票只是为了反驳。)如果您认为这个问题和答案不符合标准,请发表评论。 100 万个 dict 条目算不了什么——我使用的数据集比常规的要大得多——而且哈希表(如 Python 的 dict 类型)几乎总是比 btree 快。同样,在尝试优化解决方案之前对其进行基准测试。 我厌倦了这种过早的优化论点。预先做出谨慎的技术选择——错误的选择会招致债务。我经常听到“我稍后再回去做”,但我发现 6 年前的代码中仍然有相同的 TODO。不要让其他人阻止您发现 list.indexOf(123) 的速度是否合理,而 set() 中的 123 是否合理 - 这并不是过早的优化;) 【参考方案1】:

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

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

英文信息随处可见。

【讨论】:

【参考方案2】:

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

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

编辑:我曾经有机会证明上述内容是真实的;为此,blist 包似乎是排序容器库的最完整实现。

【讨论】:

Berkeley DB 当然允许您使用游标进行范围查询。见docs.oracle.com/cd/E17076_02/html/gsg/CXX/Positioning.html 关于“选择 B 树而不是哈希表的唯一原因,无论是在内存中还是在块存储中......是支持除相等之外的查询”的描述是不正确的。除了范围属性之外,b-trees 还提供高效的有序遍历。这可能非常重要。 “有序遍历”是一个与范围查询密切相关的概念,因此我将它们混为一谈。 使用 btree 的另一个重要原因 - 保证最坏情况下的性能。只有当没有人试图通过哈希冲突对您进行 DOS 操作时,哈希表才会很快。 遗憾的是,这个项目已经死了。并且 Raymond 做了任意的 squash 以保持 Python 的速度更快。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

http://fallabs.com/kyotocabinet/

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

【讨论】:

【参考方案6】:

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

编辑:

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

替换python的内置列表。

【讨论】:

从技术上讲,这是我程序的一部分,我不想使用像 mysql 这样的传统数据库 .. 我被告知要记住数据插入将是大集合 所以哈希表提供的持续查找/访问时间对于您正在做的事情来说不够快,您正在寻找 b-tree 来加快速度?我建议在询问有关 b-tree 和哈希的问题之前阅读它们。 好吧,我做了一些基本的文献调查,发现了这个igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store 提到的统计数据让我有勇气去 B-Trees ,不幸的是没有程序的 python 实现。 tokyo cabinet 的缩放考虑不适用于您的项目。即使您需要扩展到数百个节点,也需要针对自己的情况进行优化。 ...那篇文章显示,在每个实例中,散列的使用时间都比 b-tree 好。

以上是关于Python中有B-Tree数据库或框架吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL—2B-Tree,B+Tree,聚集索引,非聚集索引

SQLite:仅从其字节识别页面类型?

如何在磁盘上布局 B-Tree 数据?

查询以显示 mysql 数据库中 B-Tree 索引的限制

好程序员分享Python之五分钟了解Django框架设计

Oracle 压缩/b-tree 索引如何以及何时使用