2013-01-10 4 views
2

데이터가 거의 100,000 개이며 Java 코드를 통해 XSSFWorkbook을 사용하여 .xlsx 파일에 데이터를 쓰려고합니다. 데이터베이스에서 모든 데이터를 ArrayList으로 가져올 수 있습니다. ArryList을 반복하여 데이터를 셀 단위로 .xlsx 파일에 쓰고 있습니다. 8000 개의 행에 도달하면 java 코드에서 Out of Memory Heap Space 오류가 발생합니다.메모리 부족 오류 - Excel에 쓰는 동안 Java 힙 공간이 발생했습니다.

SXSSFWorkbookXSSFWorkbook과 비교했을 때 더 밝을 것이라고 읽었으므로 SXSSFWorkbook을 사용해 보았습니다. 하지만 여전히 같은 문제에 직면하고 있습니다.

워크 북 또는 Java 코드에 누락 된 내용이 있습니까?

처음에는 60,000 개의 레코드 데이터가있을 때 .xls 개의 파일을 사용했습니다. 동일한 자바 코드는 파일을 HSSFWorkbook으로 생성 할 수 있습니다.

Java 힙 공간을 늘리는 것은 미래에 내 데이터가 엄청나게 증가 할 수 있기 때문에 전혀 선택 사항이 아닙니다.

도움이 될 것입니다.

작은 코드 조각, Excel에 데이터를 쓰는 방법.

int rowNum = sheet.getLastRowNum(); 

Row lastRow = null ; 

Cell cell = null; 

ReportingHelperVo reportingHelperVo = null; 

for (ReportingVo reportingVo : reportingVos) { 

rowNum++; 

lastRow = sheet.createRow(rowNum); 

reportingHelperVo = reportingVo.reportingHelperVo; 

cell = lastRow.createCell(0); 

cell.setCellValue(reportingHelperVo.getLocation()); 

cell.setCellStyle(style); 

cell = lastRow.createCell(1); 

cell.setCellValue(reportingHelperVo.getCity()); 

cell.setCellStyle(style); 

cell = lastRow.createCell(2); 

cell.setCellValue(reportingHelperVo.getCountry()); 

cell.setCellStyle(style); 

} 
+0

쓰기 * 라크 * 다운로드 ...는 무엇인가? –

+0

@ AndersR.Bystrup 100,000 남 아시아 번호 체계 – Saggio

+1

괜찮아요, 근사하네요.하지만 남아시아 밖의 사람이 그것을 알기를 기대하지 마세요. – sschrass

답변

2

나는 세포에 의해 파일 셀을 .xlsx '에 할 데이터를 쓰고 있어요. 8000 개의 행에 도달하면 Java 코드에서 메모리 힙 공간 부족 오류가 발생합니다.

각 반복마다 new 개를 생성하는 대신 exsiting java 개체를 다시 사용하십시오.

그리고/또는 엑셀 대신 csv 파일을 사용하십시오.

+0

csv +1, 저도 그렇게 쓰고있었습니다 : P –

+0

시트에 쓰여진 데이터와 관련된 Excel의 매크로 기능을 사용할 수 있습니다. 따라서 확실하지는 않지만 CSV 파일은 매크로를 지원합니다. 반면에 내 고객은 Excel 보고서 – Sanjay

+0

이 루프를 통과하고 행을 만드는 코드를 게시 할 것으로 예상합니다. 임시로 보유하고있는 Java 객체를 사용하십시오 – NimChimpsky

0

페이지를 한 번에 모두 읽는 대신 데이터베이스에서 결과를 얻습니다.

+0

데이터베이스에서 데이터를 작은 청크 (5000 레코드)로 가져온 다음 Excel에 데이터를 쓰고 또 다른 5000 레코드를 가져 와서 기존 Excel에 추가합니다. . 하지만 여전히 15,000 개의 레코드로 작성 중이면 Java 코드에서 OOM 오류가 발생합니다. – Sanjay

+0

힙 크기는 얼마나 큽니까? 네가 그걸 늘릴 수 없다는 거 알아, 너는 놀고있는 숫자가 뭐니? Excel 파일은 메모리 공간이 매우 길며 간단히 충분하지 않을 수도 있습니다. 예상 한 행의 양을 가진 더미 Excel 시트를 만드는 경우 API를 사용하여 읽을 수 있습니까? 또는 또한 OOM을 반환합니까? – codeghost

+0

내 Apache Tomcat5.5 힙 크기는 1024m입니다. 나는 기대하고있는 행의 양으로 더미 .xlsx 파일을 읽으려고했다. 그리고 OOM을 던졌습니다. – Sanjay

5

XSSFWorkbook - 모든 Excel 문서에 대한 개체 표현을 만듭니다 (DOM처럼 작동해야 함).

SXSSFWorkbook - 일정한 메모리가 필요합니다. JMV는 언제 OOM을 던집니까? ResultSet의 어떤 유형을 사용하셨습니까? FORWARD_ONLY을 사용하여 DB에서 검색 한 JDBC 드라이버로 캐싱 데이터를 제한하십시오.

알아두기 가장 좋은 OutOfMemoryError는 힙 덤프를 분석하는 것입니다. 응용 프로그램의 작동 방식을 이해하려면 -XX : + HeapDumpOnOutOfMemoryError 매개 변수와 MAT을 사용하십시오.

+0

데이터 검색에 JDBC를 사용하지 않습니다. 나는 Hibernate를 사용하고 있으며 데이터를 ArrayList로 가져온다. 더 나은 이해를 위해 XX : + HeapDumpOnOutOfMemoryError 매개 변수와 MAT를 조사해야합니다. 귀하의 제안에 감사드립니다. – Sanjay

+0

데이터 크기가 커지면 응용 프로그램이 OOM을 throw하지 않습니까? JDBC로 직접 작업하고 FetchSize 및 ResultSetType을 조정하려면 http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/Session.html#doWork(org.hibernate.jdbc.Work)를 조사하십시오. – Taky

+0

데이터 크기가 커짐에 따라 JVM에서 OOM을 throw 할 것으로 확신합니다. 그게 어디 JVM을 충분히 무료로 힙 메모리가 매번 내 코드를 최적화하고 싶습니다. 링크 해줘서 고마워. 나는 나의 코드를 시험해보고 점검 할 것이다. – Sanjay

0
Workbook workBook = new SXSSFWorkbook(); 

하나 이상의 lakh (100000) 개의 레코드를 내보낼 수 있습니다.

+0

아니야 .. 지금 당장 50,000 레코드가있다. 그러나 여전히 SXSSFWorkbook은 지원하지 않습니다. 15,000 건의 레코드 자체 .. OOM ..! – Sanjay

+0

u가 자동 크기 조정 열 또는 루프의 일부 스타일을 사용하는 경우이를 사용하지 않는 경우에도 발생할 수 있습니다. – swamy

+0

예 루프의 셀 경계에 스타일을 사용하고 있습니다. 하지만 나는 그들을 피할 수 없다 .. :(그리고 무엇을 자동 크기 조정 열입니까? 귀하의 제안을 주셔서 감사합니다 – Sanjay

0

오랫동안 R에서 Excel 파일로 쓰려고 시도했지만 (XLConnection을 사용하여) 비슷한 문제가있었습니다. 결국, write.csv를 사용하고 Excel로 열고 botton "Text to column"을 사용하여 해결했습니다. 그것은 빠르고 신뢰할 수 있습니다.

0

SXSSFWorkbook은 가볍지 만 이점이 있습니다.

통합 문서에 기록 된 모든 200 행에 대해 다음

SXSSFWorkbook workbook= new SXSSFWorkbook(200); 

로 선언하면, 메모리는 heapspace에는 부담이 없을 것 때문에 디스크 공간에 플러시됩니다.

0

필자의 엑셀이 3000 줄에 달했을 때 나는 같은 문제가있다. 제 경우에는 POI Excel 생성과 관련된 주 메모리 관련 문제가 스타일 시트와 함께 발생합니다. 다음은 내가 작성한 코드에서 삭제 한 것들입니다.

  1. 행 수준에서 스타일 시트 설정을 사용해보십시오.
  2. 모든 셀의 스타일 시트를 설정해야하는 경우 각 셀마다 테두리를 설정하지 마십시오.
0

안녕을 사용하여 최신 아파치 POI의 JAR // 그리고 스트리밍 사용 SXSSF 또는

SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
      workbook.setCompressTempFiles(true); 
      Sheet sh = workbook.createSheet(); 
      ((SXSSFSheet) sh).setRandomAccessWindowSize(100); 

// 로직

response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "attachment; 
     filename="+filename+".xlsx"); 
      workbook.write(response.getOutputStream()); 
      workbook.close(); 
      workbook.dispose(); 
관련 문제