C++ B树中的指针
我阅读了关于B树的文章,了解了它们的输入、删除方法。我读到这样的介绍: 当我们在磁盘上构建结构时,我们必须处理 访问和传输时间:C++ B树中的指针,c++,database,algorithm,data-structures,C++,Database,Algorithm,Data Structures,我阅读了关于B树的文章,了解了它们的输入、删除方法。我读到这样的介绍: 当我们在磁盘上构建结构时,我们必须处理 访问和传输时间: 对磁盘的随机访问通常需要10-20毫秒的时间 定位磁头并等待数据到达的访问时间 它 一旦头部位置正确,数据就可以以中的速率传输 超过100万字节/秒 然后,观察不同大小的总传输时间的表现 块(假设访问时间相当快,为10毫秒,每秒1兆字节 传输速率) 因此,B树数据结构是为从磁盘提供服务而设计的(这使它们对于数据库非常有用)。但当我试图实现它时,我遇到了这个问题 正常的
但是如何在磁盘上创建指针呢?它像一个文件名吗?B树中的“指针”只是文件中的一个偏移量,您可以查找它。或者,如果要使用固定的块大小,则可能是一个块编号,在查找之前乘以块大小。磁盘指针是从文件开始的偏移量 如果您的
键
指向地址n,则表示
file.seek(1024)
的方法。要执行跳转,操作系统必须知道您正在查找的数据位于磁盘中的哪个点。这涉及到更多的查找,一些磁盘移动,但这一切都是由操作系统完成的标题和元数据变得越来越复杂
键相关联的指针指向左
和右
节点
没有放置数据的位置。所以,在教科书上的例子中,比如
struct node {
int key; //this generally is the primary key of the table
node left;
node right;
long offsetOfDataInDataFile; // <----------- we need to add this line.
}
struct节点{
int key;//这通常是表的主键
左淋巴结;
节点权;
long offsetOfDataInDataFile;//存储在磁盘上的每条记录都是节点的逻辑等价物。许多节点存储在一个文件中。只需跟踪头记录的位置,每条记录都指向其子记录的偏移量。正如内存是线性资源一样,您也可以将保存记录的文件视为线性资源。每个记录将包含一个有效负载和一对偏移量来定位子记录。如果每个记录是一个节点,那么偏移量是多少?记录本身是什么,文件?和偏移量,文件名?或者所有内容都在一个大文件中,偏移量是该文件中该节点位置的偏移量?只是提醒您-指针只不过是一个地址而已s、 某些内存块的位置。这也适用于文件,因为它们可以被视为某些持久内存的块…真实的数据库是不是太大太长的文件?是的。在大多数数据库中,大长文件是常见的。索引(b树)存储为单独的文件。不同的是文件格式、索引格式、打包、压缩、算法实现、额外功能等。一些数据库(如ms access和sqlite)将其整个世界打包在一个文件中。大型数据库(如oracle)可能会采用未格式化(原始)格式磁盘,并在其上实现自己的高度专业化的文件系统。从一开始读取文件并跳到偏移量是一个可笑的建议。B树假定随机访问。您将寻找偏移量。这不是“优化”,而是算法的基本部分。您的示例是关于二叉树,而不是B树。@EJP,搜索是不是优化,它是算法的重要组成部分。已接受。在键入答案时,我认为对于OP,读取和丢弃方法更容易理解。使用seek
方法,会涉及OS和h/w,OS参考磁盘索引,然后指示h/w将磁头移动到该圆柱体。OP已重新上卷在数据库索引下,所以我想把磁盘索引放在一边。