文件大数据量读取(1亿)

在处理上亿数据时,需要用到jdk1.8新增的Stream流

我在写这一篇文件大数据量处理时,实际造了一文件,每一行是两个uuid造的数据,72位的字符串,总数据量是93940251行,文件内存6.86G

部分业务遇到这种场景时,涉及到的数据量可能会更大,比如我之前做的一个项目,实际数据量在9000w,文件内存20G,因为每一行读出来的数据位数在200位

我们处理这种内存特别大的文件时使用stream流

这是实际文件的读取速度

private static void readText() throws Exception {
        String filePath = "/Users/**/IdeaProjects/spring-ai/src/main/resources/text.txt";
        //文件的绝对路径
        File file = new File(filePath);
        Path path = Paths.get(filePath);
        long fileSize = Files.size(path);
        //创建File文件IO流对象,读取格式为UTF-8,读取格式为GBK就自己改一下
        try ( BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(new FileInputStream(file),"UTF-8"))){
            long startTime = System.currentTimeMillis();
            Long count = 0L;
            //while死循环,不知道文件具体的行数,需要用到死循环保证文件全部读取出来
            while (true) {
                //获取stream流
                try (Stream<String> lines = bufferedReader.lines()){
                    //分页读取该文件,5000为一页
                    try (Stream<String> limit = lines.limit(5000)){
                        //将读取出来的文件转换为集合
                        List<String> collect = limit.collect(Collectors.toList());
                        //业务逻辑处理,在业务逻辑处理时单独写一个方法进行数据处理,可以考虑对其加锁一致性,加事务保证数据幂等性


                        //计数,实际代码不需要
                        count += collect.size();
                        //当实际读取数量小于5000时,则代表为最后一页,结束读取循环
                        if(collect.size() < 5000){
                            break;
                        }
                    }
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("读取文件总花费时间:" + ((endTime - startTime)/1000) + "秒");
            System.out.println("文件总行数为:" + count);
            System.out.println("文件大小(MB): " + (fileSize / (1024 * 1024)) + " MB");
        }

    }

本质上是通过stream流处理,第一次读取文件的5000行数据,是读取文件的0-5000行的数据,第二次读取时,是读取5000-10000行之间的数据,在循环中重复创建Stream流对象进行处理,通过try在使用完后会自动关闭

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值