Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ B树中的指针_C++_Database_Algorithm_Data Structures - Fatal编程技术网

C++ B树中的指针

C++ B树中的指针,c++,database,algorithm,data-structures,C++,Database,Algorithm,Data Structures,我阅读了关于B树的文章,了解了它们的输入、删除方法。我读到这样的介绍: 当我们在磁盘上构建结构时,我们必须处理 访问和传输时间: 对磁盘的随机访问通常需要10-20毫秒的时间 定位磁头并等待数据到达的访问时间 它 一旦头部位置正确,数据就可以以中的速率传输 超过100万字节/秒 然后,观察不同大小的总传输时间的表现 块(假设访问时间相当快,为10毫秒,每秒1兆字节 传输速率) 因此,B树数据结构是为从磁盘提供服务而设计的(这使它们对于数据库非常有用)。但当我试图实现它时,我遇到了这个问题 正常的

我阅读了关于B树的文章,了解了它们的输入、删除方法。我读到这样的介绍:

当我们在磁盘上构建结构时,我们必须处理 访问和传输时间:

  • 对磁盘的随机访问通常需要10-20毫秒的时间 定位磁头并等待数据到达的访问时间 它
  • 一旦头部位置正确,数据就可以以中的速率传输 超过100万字节/秒
  • 然后,观察不同大小的总传输时间的表现 块(假设访问时间相当快,为10毫秒,每秒1兆字节 传输速率)
  • 因此,B树数据结构是为从磁盘提供服务而设计的(这使它们对于数据库非常有用)。但当我试图实现它时,我遇到了这个问题

    正常的B树图显示指向子节点的指针,这些子节点随后下降到叶子


    但是如何在磁盘上创建指针呢?它像一个文件名吗?

    B树中的“指针”只是文件中的一个偏移量,您可以查找它。或者,如果要使用固定的块大小,则可能是一个块编号,在查找之前乘以块大小。

    磁盘指针是从文件开始的偏移量

    如果您的
    指向地址n,则表示

  • 打开数据文件
  • 读取n字节,但放弃它们(或者简单地跳过它们。这称为查找。有关方法,请参见下文)
  • 开始阅读你感兴趣的数据
  • 现在,作为优化

  • 数据文件可能已经打开,比如程序启动时;当然可以部分缓存在内存中
  • 您可以明确指示框架转到文件中的特定位置,而不是读取和丢弃字节。大多数语言都有这一特点。所有的操作系统都有。这叫做寻找。您可以调用类似
    file.seek(1024)
    的方法。要执行跳转,操作系统必须知道您正在查找的数据位于磁盘中的哪个点。这涉及到更多的查找,一些磁盘移动,但这一切都是由操作系统完成的
  • 您可以开始读取数据,但要知道何时停止,可以使用固定宽度的记录,也可以将记录长度放在记录的前4个字节中。这使得
    标题和元数据变得越来越复杂
  • 有趣的是,与每个
    键相关联的指针指向
    节点
    没有放置数据的位置。所以,在教科书上的例子中,比如

    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已重新上卷在数据库索引下,所以我想把磁盘索引放在一边。