Spring

POI monitorjbl xlsx-streamer 메모리 이슈 해결

hellooooo 2024. 6. 7. 17:50
728x90

POI SAX 보다 더 간단하게 메모리 이슈를 해결할수있는 방법 

* 아래의 monitorjbl api를 사용하면 엑셀 대용량 문제가 간단하게 해결된다. 

 

POI SAX XSSFReader 대용량 엑셀 파일 읽기 OOME(Out of Memory Error) 방지

* 일단 시작 전에 대용량 테스트를 위한  eclipse Heap 영역 늘리기eclipse .ini 파일을 열기 Xms (시작크기) / Xmx (최대크기) 수정하기 참고로 Xmx 최대크기는 자기의 pc ram 사양을 확인하고 바꾸기 추천

truecode-95.tistory.com

 

 

1. poi버전에 맞는 monitorjbl .jar를 다운받기.

 

Download xlsx-streamer.jar - @com.monitorjbl

Download: xlsx-streamer.jar (com.monitorjbl) - Streaming Excel reader JAR file - Latest & All Versions

mavenlibs.com

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.13</version> <!-- 최신 버전 확인 필요 -->
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.13</version> <!-- 최신 버전 확인 필요 -->
</dependency>
<!-- https://mvnrepository.com/artifact/com.monitorjbl/xlsx-streamer -->
<dependency>
    <groupId>com.monitorjbl</groupId>
    <artifactId>xlsx-streamer</artifactId>
    <version>1.0.0</version>
</dependency>

 

2. monitorjbl api github 소스 확인 

 

monitorjbl

 

monitorjbl.github.io

@ResponseBody
@RequestMapping(value = "/excelUploadServlet.do", method = RequestMethod.POST)
public void excelUploadServlet(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    try {
        MultipartFile filePart = request.getFile("excelFile");

        try (InputStream is = filePart.getInputStream()) {
             Workbook workbook = (Workbook) StreamingReader.builder()
                    .rowCacheSize(100) // 메모리에 보관할 행의 수를 설정
                    .bufferSize(4096) // InputStream을 파일로 읽을 때 사용할 버퍼 크기를 설정
                    .open(is); // InputStream으로부터 StreamingReader 초기화

            for (int s = 0; s < workbook.getNumberOfSheets(); s++) {
                Sheet sheet = workbook.getSheetAt(s);

                for (Row row : sheet) {
                    for (Cell cell : row) {
                    } // 로직 추가
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

 

apache poi 메모리 이슈해결

apache poi(XSSFWorkbook API) 가 갖고 있는 메모리 이슈로 인해 full gc가 지속적으로 발생할 수 있다이를 근본적으로 해결하기 위해서는 read 시에 메모리 사용 증대가 발생되지 않도록 개선된 무언가가

iamreo.tistory.com