核心方案:外排序(分治+多路归并)MapReduce
外排序是指数据量太大,无法全部加载到内存中,需要将数据分成多个小块进行排序,然后将排序后的小块合并成一个大的有序块
使用K路归并算法合并这些排序好的小文件
具体实现方法:
具体示例:
内存管理:
区域 | 分配比例 | 说明 |
---|---|---|
输入缓冲区 | 800MB | 每个分块预读16MB(50分块×16MB) |
输出缓冲区 | 200MB | 写满后批量刷新至磁盘 |
阶段1:分割大文件,并排序小文件,输出多个小文件排序后的结果
private static List<File> splitAndSort(String inputFile) throws IOException {
List<File> chunks = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) {
List<Long> buffer = new ArrayList<>(MAX_CHUNK_SIZE / 8);
String line;
while ((line = reader.readLine()) != null) {
buffer.add(Long.parseLong(line));
// 内存达到阈值时执行排序和写入
if (buffer.size() >= MAX_CHUNK_SIZE / 8) {
chunks.add(sortAndWrite(buffer));
buffer.clear();
}
}
// 处理剩余数据
if (!buffer.isEmpty()) {
chunks.add(sortAndWrite(buffer));
}
}
return chunks;
}
阶段2:多路归并,使用最小堆优化
private static void mergeFiles(List<File> files, String output) throws IOException {
PriorityQueue<FileEntry> minHeap = new PriorityQueue<>(
files.size(),
Comparator.comparingLong(FileEntry::current)
);
// 初始化堆(每个文件读取一个元素)
for (File file : files) {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
if (line != null) {
minHeap.offer(new FileEntry(Long.parseLong(line), reader));
}
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(output))) {
while (!minHeap.isEmpty()) {
FileEntry entry = minHeap.poll();
writer.write(entry.current.toString());
writer.newLine();
// 从当前文件读取下一个元素
String line = entry.reader.readLine();
if (line != null) {
entry.current = Long.parseLong(line);
minHeap.offer(entry);
} else {
entry.reader.close(); // 关闭已读完的文件
}
}
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有