자바에서 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 패키지에 있는 클래스를 활용하는 것 도 좋을 것 같다.
반응형
'Java(자바)' 카테고리의 다른 글
Java quartz synchronize (quartz 동기화, quartz 순서) (0) | 2020.05.26 |
---|---|
Java Mqtt 연동(MqttClient, MqttCallback, org.eclipse.paho) (8) | 2020.03.05 |
Java 매우 쉬운 날짜 사용 (LocalDate, Java 1.8 date), Java 현재 날짜 (0) | 2019.12.16 |
JAVA sftp 파일전송, 자바 sftp 파일전송 (JSch 파일전송) (2) | 2019.12.13 |
Java CSV 한글 깨짐, Java make csv file, 자바 CSV 파일 깨짐 (2) | 2019.11.11 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글