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

针对大文件处理慢的问题,文章提出了一个解决方案。首先使用Java执行Linux命令切割大文件,然后通过多线程并利用CountDownLatch进行同步,对切割后的小文件进行读取和入库操作,从而提高处理效率。

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

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

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

方案:(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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值