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에 따라 라이센스가 부여됩니다.