java GZIPOutputStream性能如何提升?

当前业务为查询库内数据压缩为gz压缩包,然后上传。现在速度很慢,已经尝试优化sql,sql查询速度提升了7倍还是无法满足需求,如何提升gz压缩速度呢?
部分代码如下:

gos = new java.util.zip.GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(new File(localPath+fileName+".gz"+fileNameCrSuffix)),2*1024*1024),2*1024*1024);
        var processTime1 = System.currentTimeMillis();
        ESB.log.info(objInfo.name+"执行DTL,querysqlinfo:"+squerySqlStr);
        stmt = threadDbConn.prepareStatement(querySqlStr);
        //stmt.setFetchSize(10000);
        var sindex = 1;
        if(beginValue!=null&&endValue!=null){//判断是否分段处理
            setValue(stmt,sindex,beginValue,tempInfo.fdValueType);
            sindex++;
            setValue(stmt,sindex,endValue,tempInfo.fdValueType);
            sindex++;
        }
        if(sqlValues!=null){
            for(var j=0;j<sqlValues.length;j++){
                var index = j+sindex;
                setValue(stmt,index,sqlValues[j][1],sqlValues[j][0]);
            }
        }
        var rs = stmt.executeQuery();
        var processTime2 = System.currentTimeMillis();
        while(rs.next()){

            gos.write(rs.getString(1).getBytes(charSet));
        }
        rs.close();
        stmt.close();
        gos.finish();
        gos.flush();
        gos.close();
        var processTime3 = System.currentTimeMillis();

1个回答

(建议先排查下,是不是你的磁盘IO拖慢了速度)
如果你真的认为是压缩算法耗时,那可以改成多线程来提升,毕竟现在的CPU都是多核。
将从数据库读取的原始数据放到一个queue中,再启动多个线程从queue中取数据并压缩。然后将压缩后的数据,按顺序写盘

ToFind1996
ToFind1996 磁盘方面提升不了,因为是甲方的机器,现在已经使用多线程来写入文件了,如果将原始数据放入队列再进行多线程压缩会不会导致文件录入格式混乱。另外一点,感觉还有可能是rs游标速度过慢,正在想办法优化。感谢您的回答。
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问