2016-08-24 2 views
0

현재 Google은 엑셀에 저장하고 다운로드하기 위해 DB에 저장된 레코드를 내보내는 데 XSSF를 사용하고 있습니다. 요구 사항에 따라 사용자가 300 만 개의 레코드를 다운로드 할 수 있어야합니다.OutOfMemory 또는 XSSF를 사용한 GC 오버 헤드

XSSF에서는 OutOfMemoryError : GC 오버 헤드 한도를 초과했습니다.

저는 XSSF가 메모리가 부족하다는 사실을 알고 조사했습니다. 어떤 사람이 내 요구 사항을 달성하기 위해 더 나은 방법을 제안 할 수 있습니까? 엑셀 형식으로 데이터를 다운로드해야하며 명시 적으로 디스크에 쓰지 않으려합니다.

+3

가능한 복제 (http://stackoverflow.com/questions/33368612/gc-overhead-limit-exceeded-with-apache-poi) –

답변

0

POI API을 사용할 수 있습니다. 우리는 POI API를 사용하여 프로그램에서 큰 Excel 파일로 스트리밍을 성공적으로 구현했습니다. 메모리에 저장되는 행 크기를 낮게 유지하는 것이 중요하며 나머지는 기본적으로 디스크에서 수행됩니다.

또한 SXSSFWorkbook.setCompressTempFiles를 설정하여 임시 XML 파일이 디스크에서 커질 수 없도록 방지 할 수 있습니다.

flushRows()를 사용하면 수동으로 행을 디스크로 플러시 할 수 있습니다.

그러나 이것은 느립니다. 그러나 메모리가 유일한 제약 조건이라면.

일부 메소드는 암시 적으로 행에 액세스합니다. 이러한 행이 이미 디스크로 스왑 된 경우 오류가 발생할 것이며 API는 큰 Excel 파일을 작성하기위한 용도로만 사용됩니다.

public static void main(String[] args) throws Throwable { 
     SXSSFWorkbook wb = new SXSSFWorkbook(); 
     wb.setCompressTempFiles(true); 

     SXSSFSheet sh = (SXSSFSheet) wb.getSheetAt(0); 
     sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk, this is also the default 
     for(int i= 1; i < 100000; i++){ 
      Row row = sh.createRow(i); // do something with the row 
     } 
    } 
[아파치 POI와 초과 GC 오버 헤드 제한]의
관련 문제