External Storage

         以前所说的数据结构都是放在主存里面的,比如对一个数组的排序 ,就是将数组完全的放到内存里面,然后再进行排序。如果这个数组大小是几M或者几是M,那么都可以放到主存当中,但是当这个数组与500M或者更高呢?很显然是不可能放到主存中的,只能先存储在外存,然后分块的读到内存中来。。。。。

         数据存储在外存和存储在内存有很大的不同,在内存的数据可以很容易的将某部分数据进行移动,但是在外存则不然,比如说将数组的某部分数据全部向后移一格,那么每次移动都要先通过硬盘的读写头定位到要移动的数据的地方,然后将这块数据读到内存中,再把这个数据写到相应的位置,那么硬盘的读写头又要移动,定位到要写的地方,再进行写操作。。。。这些硬盘读写头的定位操作是一个机械的操作,不像电信号,它操作所花费的时间相当的多。。。。

        操作系统从外存读写数据时,一般是按块来读写的。这个块的大小依据不同的操作系统而不同。块是每次外存读写时最小的单位,如果你只需要读一个int也就是4 bytes,它也会一次性读取一个块的数据,比如8192bytes,然后将后面的数据抛弃。所以,你的程序最好每次读取的数据是块的整数倍,那么你的程序将是很有效率的。

       有的人将数据以一种连续的方式放到外存中,比如以有序树组的方式。但是这种方式在插入一条新的数据是是非常不方便的。必须将一部分数据进行移动,前面已经说了,在外存中移动数据是相当的耗费时间的。所以就引入了一种心得数据结构:B-Tree.

       B-Tree和2-3-4Tree一样是一种多路的树,有很多的孩子,不只4个。它是将一个Block抽象成一个Node,Block里面的每条数据就是这个Node的数据项。然后每条数据项将不仅仅存放数据,还存放了孩子的连接,这里的连接不同与二叉树的,二叉树是referrence而这里是孩子的块的编号。那么在search的时候,就和search二叉树一样,不同的是insert的时候,不同于2-3-4Tree的是,当遇到满的Node的时候,它是将一半的数据移到新结点中,一半留下;不是将原来结点中的中间一个移到父结点,而是将加上新结点的一个序列中的中间项移动到父结点的。Node的拆分不同于2-3-4Tree是自上而下的,而是自下而上的。用B-Tree的好处在于减少了block的读取数,也就是减少了磁盘的读取,还有就是增加了磁盘的利用率,因为每个结点都是大于一半的利用率;而且B-Tree的Node拆分会出现的很少的情况下。

        用B-Tree来描述磁盘的数据固然是个好办法,但是用索引的话,效果将更好。索引就是将key/blocks成对出现。一个索引由一个key和一个block的地址组成。因为一般索引将是非常小的了,所以完全可以把它放到主存中。索引可以保存在硬盘中,然后每次数据库程序启动的时候再读到内存当中来。用这种方式,search,insert,delete将变的非常的简单。在插入的时候,只要将数据插入到文件的末尾,然后建一个索引就可以了。用索引也允许用多个不同的数据做为排序的依据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值