如何排序 10GB 文件:外部排序的工程方案

副标题 / 摘要 内存无法容纳 10GB 数据时,外部排序是标准方案。本文介绍分块排序与多路归并。 目标读者 需要处理大文件的工程师 学习外部排序算法的读者 关注磁盘 I/O 优化的人 背景 / 动机 当数据量超过内存容量,传统内存排序会失败。 外部排序通过“分块 + 多路归并”解决问题。 核心概念 分块排序:把大文件拆成可放入内存的小块 多路归并:合并多个有序块 磁盘 I/O:顺序读写优于随机读写 实践指南 / 步骤 按内存容量分块读取 每块内存排序并写回磁盘 多路归并所有有序块 尽量顺序读写减少随机 I/O 可运行示例 # 简化示例:分块排序 + 归并 import heapq def merge_sorted(chunks): heap = [] for i, chunk in enumerate(chunks): if chunk: heapq.heappush(heap, (chunk[0], i, 0)) result = [] while heap: val, i, j = heapq.heappop(heap) result.append(val) if j + 1 < len(chunks[i]): heapq.heappush(heap, (chunks[i][j + 1], i, j + 1)) return result if __name__ == "__main__": chunks = [sorted([3, 1, 2]), sorted([9, 7, 8])] print(merge_sorted(chunks)) 解释与原理 外部排序的核心是把“大问题拆成小问题”,每块可在内存中排序。 最后通过多路归并生成整体有序序列。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

如何排序 10TB 数据:分布式排序思路

副标题 / 摘要 10TB 数据无法在单机完成排序。本文介绍分布式排序的核心流程与工程要点。 目标读者 处理大规模数据的工程师 学习分布式系统的开发者 关注数据处理流程的人 背景 / 动机 数据规模超过单机能力时,必须通过分布式拆分与并行归并完成排序。 这涉及数据切分、网络传输与容错。 核心概念 分片(Shard):数据切分到多个节点 Shuffle:按 key 重新分配数据 分布式归并:跨节点合并有序块 实践指南 / 步骤 按范围或哈希切分数据 各节点本地排序 Shuffle 让相同范围的数据聚集 全局归并并输出结果 可运行示例 # 简化的“分片排序”示意 def shard_sort(chunks): return [sorted(c) for c in chunks] def merge_two(a, b): i = j = 0 res = [] while i < len(a) and j < len(b): if a[i] < b[j]: res.append(a[i]); i += 1 else: res.append(b[j]); j += 1 res.extend(a[i:]) res.extend(b[j:]) return res if __name__ == "__main__": shards = shard_sort([[3, 1], [4, 2]]) print(merge_two(shards[0], shards[1])) 解释与原理 分布式排序的关键在于“局部排序 + 全局归并”。 Shuffle 会成为主要瓶颈,需要优化网络与分区策略。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]