【发布时间】:2011-04-06 20:48:19
【问题描述】:
我需要实现一个具有超过 100M 记录的优先级队列的应用程序。我的问题是我无法将所有这些数据保存在内存中,因此我需要将其存储在磁盘上。是否有任何缓存解决方案可以将所有这些信息存储到磁盘?
【问题讨论】:
-
您找到解决此问题的方法了吗?我很想听听!
标签: caching data-structures priority-queue disk
我需要实现一个具有超过 100M 记录的优先级队列的应用程序。我的问题是我无法将所有这些数据保存在内存中,因此我需要将其存储在磁盘上。是否有任何缓存解决方案可以将所有这些信息存储到磁盘?
【问题讨论】:
标签: caching data-structures priority-queue disk
我认为您可以通过使用 B 树并稍作修改来解决此问题。
B-trees 专门设计用于将排序的元素存储在磁盘上,以最大限度地减少定位任何元素所需的磁盘读取次数。因为它们按排序顺序存储元素,所以您可以将它们用作优先队列,方法是正常执行插入操作,并通过获取树中最左边的元素(即最左边叶节点的第一个元素)来找到最小元素。
在 d 阶的 B-tree 中,您可以使用 O(logd n) 磁盘读取和写入找到最小元素,其中 n 是元素的总数。插入和删除也只需要 O(logd n) 次磁盘读取和写入。
但是,您可以通过存储指向 B 树中最左侧叶节点的指针来显着加快此速度。该节点将存储最小密钥以及接近最小值的其他密钥。如果你有这个指针,你可以通过获取节点中的第一个元素来查找单个磁盘读取中的最小值。这也加快了 extract-min 操作:您可以直接从该节点删除密钥,而无需搜索它。可能需要一些 B-tree 重新平衡操作来完成这项工作,尽管您可以证明这些操作发生的频率非常低,以至于执行删除的摊销工作只需 O(1)。
换句话说,使用带有指向最左边叶子的指针的 B 树在磁盘读取和写入方面具有以下时间复杂度:
希望这会有所帮助!
【讨论】: