Skip to content

外存 / I/O 模型

External-memory model · I/O model · Aggarwal–Vitter model

只计大小为 B 的数据块在容量为 M 的内存与外存之间传输次数的两层存储模型。

条目类型
模型

形式陈述

Aggarwal–Vitter 外存模型把数据分置于两层:内部存储可容纳 M 个元素,外部存储按连续块组织,每块含 B 个元素。一次 I/O 在两层之间传输一个完整块,内部计算免费;算法复杂度是 I/O 次数。输入规模为 N 个元素,并通常假设 1BM/2N>M,且 M,B,N 使用同一计量单位。若数据已在外存连续排列,完整读取的最优量级为

Scan(N)=Θ(NB).

在比较模型的标准参数范围内,外排的量级为

Sort(N)=Θ(NBlogM/BNB),

其中当 NM 或对数小于常数时应把表达式理解为至少一次扫描的成本。上界由多路归并达到:内存同时缓冲约 M/B 个有序段,每轮把段数缩小同一因子;下界来自一次 I/O 可实现的排列信息有限。

直觉

数组在 RAM 分析中连续读取 N 项仍算 N 次操作,随机读取也可能同阶;I/O 模型则把真正稀缺的跨层传输单独计价。一次块传输既然已经付费,算法应尽量使用块内全部 B 个元素。顺序扫描因此只花约 N/B 次 I/O,而反复触碰相距很远的位置可能每个元素都触发一次传输。

M/B 表示内存能同时驻留多少块,也决定外排可进行多少路归并。B 树采用与块相称的高扇出,是同一原则在动态索引中的体现:每次读入一个节点便获得大量分支信息,而不是按二叉树深度逐层付费。

完整块传输与内存容量
例子与边界

N=109 个记录、每块容纳 B=4096 个记录,连续扫描约需 2.45×105 次块传输,而按随机位置读取每条记录最坏可接近 109 次。这里的数字不是换一组参数后的装饰:两种访问次序在 RAM 中同为 Θ(N),在 I/O 模型中却相差约一个块因子,直接揭示模型要捕捉的瓶颈。

多路归并排序先在内存中形成大小约 M 的有序段,再为每个输入段保留一块缓冲并批量输出。若每轮只能做二路归并,会忽略内存可同时容纳许多块的能力,增加不必要的轮数。相反,若整个输入已装入内存,则读入和写回各一次扫描即可,外排公式中的对数阶段不再出现。

该模型不是对机械硬盘寻道时间的逐周期仿真,也不声称 CPU 工作真的免费;它有意隔离数据搬运下界。某些 cache-oblivious 结果另需 tall-cache 假设,例如 M=Ω(B2),不能把该条件倒灌成所有外存算法的定义。若一个作者以字节计 M,B、另一个以记录计,比较公式前还必须固定记录大小。

推论与应用

外存分析为数据库索引、文件排序、图处理和科学计算提供统一成本语言。渐近记号在这里计的是块传输而非指令;同一算法可以拥有良好的 CPU 时间却产生糟糕的 I/O 模式。缓存无关模型保留分层传输的分析目标,却要求算法不显式读取 BM外存排序则把扫描、分批与多路归并组织成可达到排序 I/O 界的具体过程。B 树、B+ 树与缓冲树沿另一条路线用高扇出和批处理控制索引更新。

模型还提醒实现者区分“顺序工作量”和“数据移动量”。把循环常数优化到更小,无法弥补访问顺序导致的额外块传输;只有重排计算、分块或改变数据布局,才能触及 I/O 复杂度的主项。

参考资料
  • Alok Aggarwal and Jeffrey S. Vitter, “The Input/Output Complexity of Sorting and Related Problems,” Communications of the ACM 31(9), 1988, pp. 1116–1127.
  • Jeffrey S. Vitter, Algorithms and Data Structures for External Memory, Now Publishers, 2008, Chs. 2–3.
关系图谱15 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组