excel 메모리 넘침 문제 해결 방식 생성

5824 단어 Excel
자주 사용하는 excel 생성 도구는 jxl,poi를 포함합니다.그러나 양자 모두 하나의 문제가 존재한다. excel을 생성하려면 메모리를 대량으로 소모해야 한다.excel에 한 번에 충분한 데이터를 쓰면 메모리가 넘칠 수 있습니다.
1. 데이터 쓰기 excel은 왜 메모리를 대량으로 소모합니까?
이것은 excel의 특징과 jxl과poi의 실현 원리에서 분석해야 한다.excel은 표입니다. 하나하나의 칸입니다.우리가 excel을 만드는 것은 하나의 칸에 데이터를 쓰는 것이다.다음 코드(사용 jxl):
WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName));

            WritableSheet ws = wwb.createSheet(wjmc, 0);

            WritableFont wfont = new jxl.write.WritableFont(

                        WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,

                        UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);

            jxl.write.WritableCellFormat normalStyle = new jxl.write.WritableCellFormat(wfont);

            normalStyle.setLocked(true);//  

            /**  begin */

            Label labelC = null;

            labelC = new Label(0, 0, " ");

            ws.addCell(labelC);

            labelC = new Label(1, 0, " ");

            ws.addCell(labelC);

            StringBuffer sycxString=null;

            if (rs != null) {

                int j = 1;

                while (rs.next()) {

                    String id = rs.getString("id");

                    

                    sycxList = getSycxList(id);

                    sycxString = new StringBuffer();

                    if (sycxList != null) {

                        for (Iterator it = sycxList.iterator(); it.hasNext();) {

                            sycxString.append((String) it.next()).append("
"); } } String commonPart=rs.getString("sec_id") == null?" ":" "; labelC = new Label(0, j, rs.getString("ljmc"), normalStyle); ws.addCell(labelC); labelC = new Label(1, j, rs.getString("ljbm"), normalStyle); ws.addCell(labelC); j++; }

이것은 전형적인 excel 생성 코드입니다.이런 논리는 데이터의 양이 적을 때 문제가 없다.그러나 빨간색 표시된 줄과 같은 데이터 양이 많으면 모든 칸은 new의 대상이 필요합니다.가장 중요한 것은 이 대상들은 excel 대상 Writable Sheet에 인용되어 excel 전체 생성이 완료되기 전에 회수할 수 없습니다.메모리가 이렇게 점유되어 소모되었다!다중 사용자가 동시에 excel을 내보내면...분명히 jvm 메모리 넘침은 필연적입니다!
2. 메모리 오버플로우를 방지하는 방법은 무엇입니까?
위에서 분석한 메모리가 넘치는 주요 원인은 데이터의 양이 많을 때 개척된 메모리 공간이 방출되지 않기 때문이다.차지하는 시간을 줄일 수 있다면 메모리는 제때에 방출될 수 있다.메모리 넘침을 피하십시오!차지하는 시간을 줄이려면 excel에 쓰는 데이터의 양을 줄여야 합니다.하나의 excel을 단시간 내에 완전히 생성할 수 있도록 합니다.대량의 데이터를 여러 개의 excel에 차례로 쓸 것입니다!이렇게 하면 excel 생성이 완료되면 인용된 칸 대상이 회수되어 방출됩니다.
i3.8 버전 이후 이런 메모리 넘침을 해결하는 새로운 방법을 도입했다.다음 코드:
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk  

 Sheet sh = wb.createSheet();  

 for(int rownum = 0; rownum < 100000; rownum++){ 

 Row row = sh.createRow(rownum);  

 for(int cellnum = 0; cellnum < 10; cellnum++){  

 Cell cell = row.createCell(cellnum);  

 String address = new CellReference(cell).formatAsString();  

 cell.setCellValue(address); }  

 } 

FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");  

 wb.write(out);  

 out.close(); 

excel 대상을 생성할 때 메모리에 보존된 데이터의 양을 지정할 수 있습니다.지정된 데이터 양을 초과하면 이전 데이터가 하드 드라이브로 이동합니다.(주: 이 방법이 유효한지 개인은 아직 검증하지 않았습니다) 이렇게 하면 모든 단원격 데이터가 메모리에 보존되어 방출되지 않는 것을 피할 수 있습니다!

좋은 웹페이지 즐겨찾기