External Sort Introduction & Example

Backgroud

通常我们所说的排序一般都属于内存直接能容纳所有数据,直接可以在内存完成的排序。而现实情况通常是数据无法一次性装入内存,而需要多次装入装出内存才能完成排序操作。最常见的用于外部排序的方法就是归并排序 (Merge Sort)。

Specification

  • 数据最开始都存在与磁盘中,磁盘数据以页(page)为基本单位,需要装入内存才能完成排序操作
  • 内存能容纳磁盘数据页的数量为 B, 待排序的数据共有 N

Sort Process

  1. 从磁盘读取 B页数据到内存中
  2. 把这B页数据进行排序(此时为内部排序,排序方法任意)
  3. 把排序结果写回磁盘
  4. 重复1-3直到把所有N页数据都按照每 B 页一组排序完成后写回磁盘
  5. 1-4 完成了 PASS #0 ,此过程保证了磁盘中每B页为一组的数据是有序的(当B=3 时就是2-Way Sort)
  6. 1-5 过程使得磁盘存在每B页为一组的数据是有序的,那么我们只需要对这些有序数据执行 Merge 操作即可完成排序。
  7. 因为内存只能同时容纳 B 页数据,合并过程需要有1页作为输出页(out page),其他 B-1页,可以进行合并操作
  8. 合并具体过程是,从每一组已经排好序的磁盘页面中按顺序依次读取1页到内存中的一页,经过PASS #0 后,共有[N / B] 组有序的数据,对于B页的内存而言,就是 (B-1)路 归并排序。
  9. 每次从[N/B] 组数据选取一组(每组共有B页数据,由Step1-4决定),然后按顺序读取 1 页
  10. 执行 Step 9 ,一共选出 B - 1 组数据,并按序读取其中的一页,然后依次合并,并放到输出页,当输出页满了就写回磁盘。本质上就是对 B-1个有序数组进行合并的过程。 至此 PASS #1 完成
  11. 递归执行7-11,直到最后所有数据都有序。

2-Way Sort (二路排序)

  • 下面是 B = 3 的 External Sort 示例图
    在这里插入图片描述
  • 样例解释
    • 在 PASS #0 阶段,因为不需要Merge 操作,因此所有的 B 页都可以用于排序,依次读入所有页面,然后排序后写回磁盘
    • B = 3. 除去一个输出页,每次只有 2 个内存页面可以使用,因此每次可以对两组(注意,这里说的是两组,不是两页,因为每组页数取决于 PASS #0的一次排序页数和后续的 PASS # 轮次数)有序数据进行合并,示例中因为第一轮读入排序的数据刚好为 1 页,因此第一轮时,每次合并的两组数据均为 1 页(eg. 3,4 vs 2,6)
    • 经过第一轮合并,每组数据为2页,然后按顺序每次读入每组数据的1页和另一组数据进行合并,参考 PASS #1 到 PASS #2 的过程。此轮合并后,数据一共被合并为 2 组,每次内存只能合并两组,因此,下一轮就能完成数据合并操作。

Complecity

Number of Passes
  • 总的页面数量为 N N N,内存能容纳 B B B 页数据,除去输出页,有效用于合并内存页为 B − 1 B-1 B1
    • 经过排序后,共有 N B \frac{N}{B} BN 组数据
    • 第一轮合并后还有 N / B B − 1 \frac{N/B}{B - 1} B1N/B 组有序数据需要合并
    • 第二轮合并后还有 N / B ( B − 1 ) 2 \frac{N/B}{(B-1)^2} (B1)2N/B 组有序数据
    • 假设经过 n 轮后,数据完全有序,此时为1组数据,即 N / B ( B − 1 ) n = 1 \frac{N/B}{{(B-1)}^n} = 1 (B1)nN/B=1
    • 那么 n = log ⁡ ( B − 1 ) N / B n = \log_{(B-1)}{N/B} n=log(B1)N/B
    • 当 B = 3 时, n = log ⁡ 2 N / 3 n = \log_2{N/3} n=log2N/3,这里是 N / 3 N / 3 N/3 而不是 N N N,是因为示例中 PASS #0 每次只读入 1 个页面进行排序(尽管可以读入 3 个,毕竟是举例,方便理解罢了~)
Total IO Cost
  • 每轮次,无论是 PASS #0 的排序过程,还是 后续所有轮次的数据合并操作,都是需要把每页数据 read & write ,因此,以页面为计算单位的话,总共的 IO 次数为 2N * (# of passes),# of passes 表示轮次数。
Results

General External Sort

Example
  • 举例
    N为108,B为5 举例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值