内存不足时的大文件排序算法(spark shuffle的排序算法)

本文介绍了一种针对无法完全加载到内存的大文件进行排序的方法。通过分批读取、内存排序、磁盘溢写和多路归并等步骤,实现了大规模数据的有效排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题场景

        例如:当前磁盘2T,内存16G,文件大小500G。现在需要对500G的大文件进行排序,并存道另一个文件中。

        抽象:当前有包含10000行数的文件,再只能使用长度为1000的数组的前提下,对文件中的数据进行排序,并存道另一个文件中。

2、问题分析

        首先,数据的总量大于了所能使用的内存数据结构的容量,所以肯定不能完全通过内存排序。因此需要采用一种分治的思想来实现全局排序。

        (1)数组总量10000,数组容量1000,所以可以分十次读取数据,每次读取1000条数据,再内存中对1000条数据进行排序。

        (2)单次排完序的数据写入磁盘临时文件。总供会有10个局部有序的磁盘文件。

        (3)同时打开10个磁盘文件,创建reader。每个磁盘文件都读入第一行数据,即局部最小的数据。

        (4)找到10个局部最小数据中的最小值。

        (5)对每个磁盘文件,判断当前最小值是否等于全局最小值。如果等于则写出,并获取下一行数据,继续比较。

        (6)当所有文件都比较并输出完之后,重新计算当前10个局部最小数据中的最小值。继续比较输出,直到所有磁盘文件全部读完。

        (7)此时输出的文件就是一个全局有序的文件。

3、生成测试数据

public class CreateTestData {
    public static void main(String[] args) throws IOException {

        String filePath = "C:\\Users\\yangshen\\code\\java\\stu-project\\src\\main\\resources\\input.txt";
        BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));

        Random random = new Random(1);

        int num = 0;
        while (num < 10000) {
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值