excel 메모리 넘침 문제 해결 방식 생성
                                            
 5824 단어  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 대상을 생성할 때 메모리에 보존된 데이터의 양을 지정할 수 있습니다.지정된 데이터 양을 초과하면 이전 데이터가 하드 드라이브로 이동합니다.(주: 이 방법이 유효한지 개인은 아직 검증하지 않았습니다) 이렇게 하면 모든 단원격 데이터가 메모리에 보존되어 방출되지 않는 것을 피할 수 있습니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Excel Grep toolExcel Grep tool ■히나가타 ■ 시트 구성 ExcelGrep.cls...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.