在处理上亿数据时,需要用到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在使用完后会自动关闭

被折叠的 条评论
为什么被折叠?



