高效率解决80W数据读取的方案。
这里我们使用流的方式进行读取文件。其实80W的数据并不是大数据量,使用流方式完全可以。读取大文件之前一定要预估一下这个文件到底有多大。我们可以看一下每一行占多少个字节,然后乘以80W可以看看有多大。汉字utf8占3个字节、gbk占2个字节。换算一下有多少兆。
我的这个文件80W行数据,约占10兆左右。
下面我们使用java代码来实现这个功能:
/**
* @Author FHL
* @Description: 读取文本文件内容
* @Date: 2020/9/22 20:45
* @Param: []
* @return: void
*/
@Test
public void readTextFile() {
long readStartTime = System.currentTimeMillis();
List<String> listCded = new ArrayList<>();
String testFile = "文件地址";
try(FileReader reader = new FileReader(testFile);
BufferedReader br = new BufferedReader(reader)) {
String line;
//按行读取数据
while ((line = br.readLine()) != null){
//封装到集合中
listCded.add(line );
//logger.info("文件内容:"+line);
}
long readEndTime = System.currentTimeMillis();
logger.info("读取共用时:"+(readEndTime-readStartTime));
long insertStartTime = System.currentTimeMillis();
//执行SQL
Integer integer = cpicDdzsActivityDao.insertEmpno(listCded);
logger.info("插入数据量:"+integer);
long insertEndTime = System.currentTimeMillis();
logger.info("插入共用时:"+(insertEndTime-insertStartTime));
logger.info("一共用时"+(insertEndTime-readStartTime));
}catch (Exception e){
e.printStackTrace();
}
}
亲测没有问题,3分钟左右可以读取完成。如果读取出来的数据需要插入数据库,切记不能一下全部插入(insert into A (a,b,c) values (1,2,3),(1,2,3),(1,2,3),…80万)。批量插入的时候需要注意,每插入10W,最好就释放一下数据库缓冲区,因为在真正插入的时候innoDB的存储引擎是需要插入到缓冲区,目的就是为了更大的提高SQL解析的速度和执行性能。如果缓冲区设置小,就会产生溢出了。一般,mysql对这种操作都需要做优化。