본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

Java excel poi 메모리 누수 대비(memory leak), 자바 xlsx만들기, Java xlsx 만들기

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 12. 19.

 

자바에서 poi라는 패키지는 엑셀을 만드는데 자주 사용되는 라이브러리이다.

그런데 요녀석을 사용하다보면 메모리를 너무많이 사용해서 문제가 되는 경우가 많다.

아래 코드를 보면 통상적으로 xlsx 파일을 만드는 모습이다.

//생략..

XSSFWorkbook  workbook = new XSSFWorkbook();
XSSFSheet  sheet = workbook.createSheet();
XSSFRow  row = sheet.createRow(0);
XSSFCell cell = row.createCell(1);			
cell.setCellValue("값");  

File file = new File("D:/test.xlsx");
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
workbook.close();

//생략..

 

요러한 기능을 통해서 약 3만건의 엑셀파일을 10회에 걸쳐서 여러번 만들면..

요만한 메모리가

 

요렇게 올라간다;;

 

저렇게 올라간 메모리는 어떤 이유인지는 몰라도 자바의 가비지컬렉터(gc)가 해제를 시켜주는데 꽤 오래걸렸다.

이러한 현상을 대비하기 위하여 나온 클래스가 있다!

바로 SXSSFWorkbook 라는 클래스이다.

해당 클래스는 마찬가지로 아파치poi 패키지에 포함되어 있는 기본 클래스이다. 만약 해당클래스가 없다면 라이브러리 버전을 업그레이드 해 주어야 한다.

 

사용법도 기존 메소드 호출방법과 100% 동일하다. 아래코드를 보면,

//생략..

SXSSFWorkbook  workbook = new SXSSFWorkbook();
SXSSFSheet  sheet = workbook.createSheet();
SXSSFRow  row = sheet.createRow(0);
SXSSFCell cell = row.createCell(1);			
cell.setCellValue("값");  

File file = new File("D:/test.xlsx");
FileOutputStream fos = new FileOutputStream(file);
workbook.write(fos);
workbook.close();

//생략..

 

기존 소스코드와 다른점이 없다.

패키지명을 비교하여 보면,

//기존에 메모리를 많이 사용하는 클래스
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


//메모리를 적게 사용하는 클래스
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

 

클래스 바로위에 streaming 이라는 패키지가 추가 된 것을 볼 수 있다.

클래스를 변경하고 나서 약 3만건의 엑셀파일을 10회에 걸쳐서 여러번 만들어 보았다.

오..! 기존보다 적어진 느낌이다??

 

 

만들어진 속도도 비슷한 것 같다.

엑셀을 만들다가 메모리 문제에 계속 직면한다면 poi의 streaming 패키지에 있는 클래스를 활용하는 것 도 좋을 것 같다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글