文件过大,解析文件入库性能很差

场景:文件过大,包含上百万条数据,甚至峰值能达近千万,文件过大,处理起来很慢。

解决思路:切割文件,多线程处理小文件。

方案:(java伪代码)

1、文件切割

//现根据切割后的文件前缀删除历史切割文件
String rmFileCmd = "rm" + filePath + fileNamePrefix + "-rf";
//java代码执行linux命令
Runtime.getRuntime().exec(rmFileCmd );
//睡眠等待删除临时文件完成(具体睡眠时间可以根据执行的效率改变设置)
Thread.sleep(10000);
//按照设置的行数进行切割
String splitFileCmd = "split -l" + splitLineNum + " " + originFile + " -d -a 5 " + filePath + fileNamePrefix;
//java代码执行linux命令
Runtime.getRuntime().exec(splitFileCmd);
//睡眠等待文件切割命令执行完成
Thread.sleep(10000);
//将切割后的目录下的文件,用前缀筛选后返回文件名称集合
List<String> fileNameList = new ArrayList<String>();
File[] fileParts = new File(filePath).listFiles();
if(fileParts.length > 0){
    for(File filePart : fileParts){
        if(filePart.isFile()){
            String filePartName = filePart.getName();
            String filePartPath =  filePart.getPath();
            File partFile = new File(path);
            if(partFile.exists()){
                if(filePartName.startsWith(fileNamePrefix)){
                    if(!fileNameList.contains(path)){
                        fileNameList.add(filePartPath);
                    }
                }
            }
            
        }
    }
}

2、多线程处理文件(主要是读取文件后入库)

//线程计数器,采用的是CountDownLatch
CountDownLatch latch = new CountDownLatch(fileNameList.size());
for(String fileName : fileNameList){
    threadExecutor.execute( new Runnable(){
        @Override
        public void run(){
            //处理单个文件
            method(fileName);
            //执行完后,调用countDownLatch减一
            latch.countDown();
        }
    });
}
//等待所有线程执行完
latch.await();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值