대용량 데이터 Excel처리에 대해..

17,984 views
Skip to first unread message

미랭군

unread,
Dec 22, 2010, 1:14:15 AM12/22/10
to Korea Spring User Group
프로젝트를 진행하다보니..대용량 데이터를 Excel로 다운받게 해달라는 요청이 들어와서..

며칠 동안 고민의 고민을 거듭하고 있네요;;

Spring과는 별개의 문제지만 혹시나 하는 마음에 글 올려봅니다^^;;


6만건 이상의 데이터를 POI나 JXL등으로 Excel을 생성하려고 하니 메모리 부족으로

뻗어버리는 현상이 일어나는데 혹시 대용량 데이터 Excel 다운로드 시 좋은 해결방법을

알고 계신 분 계신가요?

JUNGTAE KIM

unread,
Dec 22, 2010, 1:24:27 AM12/22/10
to ks...@googlegroups.com
자바 힙사이즈를 늘려도 에러나나요??



2010년 12월 22일 오후 3:14, 미랭군 <devz...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


Sewon Ann

unread,
Dec 22, 2010, 1:24:36 AM12/22/10
to ks...@googlegroups.com
며칠전 4만건 정도는http://jexcelapi.sourceforge.net/ 로 무리없이 작업했습니다.
메모리가 생성에 드는 메모리를 말씀하시는 거라면, html 로 만들어보시는 건 어떨까요.

하도 예전에 작업해서 지금 저에게 소스가 없지만, 아래 링크 참고해서 작업해 보세요.

데이터는 html 로 만들고, 이걸  엑셀에서 열어보면 엑셀 형식으로 잘 보입니다.

이도 저도 안되면 아얘 .csv 로 만들어보시는 최후의 대안도 있지 않을까 싶네요.


2010/12/22 미랭군 <devz...@gmail.com>

"허준형(June Hur)"

unread,
Dec 22, 2010, 1:38:39 AM12/22/10
to ks...@googlegroups.com
CSV���Ϸ� �����ֽø� �����ϰ� �ذ�������....


2010-12-22 ���� 3:14, �̷��� �� ��:
> ������Ʈ�� �����ϴٺ���..��뷮 �����͸� Excel�� �ٿ�ް� �ش޶�� ��û�� ���ͼ�..
>
> ��ĥ ���� ����� ����� �ŵ��ϰ� �ֳ׿�;;
>
> Spring��� ������ �������� Ȥ�ó� �ϴ� ������ �� �÷����ϴ�^^;;
>
>
> 6���� �̻��� �����͸� POI�� JXL������ Excel�� ���Ϸ��� �ϴ� �޸� ��������
>
> ��������� ������ �Ͼ�µ� Ȥ�� ��뷮 ������ Excel �ٿ�ε� �� ���� �ذ�����
>
> �˰� ��� �� ��Ű���?
>

신승식

unread,
Dec 22, 2010, 1:40:47 AM12/22/10
to ks...@googlegroups.com
예전 사이트에서 그런 경우
엑셀파일을 여러게로 만든다음에
집파일로 압축하여 내려보낸적이 있네요


 
2010년 12월 22일 오후 3:14, 미랭군 <devz...@gmail.com>님의 말:
프로젝트를 진행하다보니..대용량 데이터를 Excel로 다운받게 해달라는 요청이 들어와서..

신승식

unread,
Dec 22, 2010, 4:23:08 AM12/22/10
to ks...@googlegroups.com
예전에 사이트에서 그런 겨우에
엑셀을 특정 건수 이상일경우 여러 파일로 만든다음에
그 파일들을 압축하여 쏘아주는 방식으로 처리 하였습니다.

Sungchul Park

unread,
Dec 22, 2010, 7:38:16 PM12/22/10
to ks...@googlegroups.com
저도 다른 분들과 비슷한 의견인데요. 정리를 한번 해봤습니다.

1) 액셀이 대용량 데이터 처리에 적합한가?
저는 그렇지 않다고 봅니다. DB와 표 계산 프로그램은 엄연히 용도가 다르죠.

대안
  1. 데이터를 작은 단위로 나눠 여러 파일로 만들어 내려받게 처리

2) 액셀 파일이 스트리밍을 지원하는가?

액셀 파일은 완성될 때까지 메모리에 모든 데이터를 보유해야합니다. DB에서 한 줄씩 읽어서 클라이언트로 바로 출력하고 메모리에는 최소한의 데이터만 남겨두는 식으로 처리할 수 없습니다.

대안
  1. 충분한 메모리를 확보.
    윈도우에서 돌아가는 엑셀 자체도 6만라인이 들어있는 시트를 열려면 메모리를 엄청나게 많이 사용할 듯 합니다. 그러니 서버 사이드에도 그에 상응하는 (어쩌면 더 많은) 메모리를 할당해야겠죠.
  2. 엑셀 포멧이 아닌 HTML 또는 CSV를 고려.
    HTML이나 CSV는 DB에서 데이터를 읽으면서 바로 출력할 수 있으니까요. mime type만 적절하게 지정하면 바로 엑셀이 데이터를 받도록 할 수도 있습니다.

손찬욱

unread,
Dec 22, 2010, 7:59:51 PM12/22/10
to ks...@googlegroups.com
저희 프로젝트에서 위와 같은 요구사항이 있어서 처리한 적이있습니다.

최대 60만건 이상도 데이터로 뽑았습니다.
(6만건 이상이 될 경우 자동 시트가 분할되도록 하였습니다
 단, 시트 분할 등을 이용하기 위해서는 MS Office 2003이상이어야 합니다)

실제 데이터가 추출되어 다운로드되는 시간은 몇 10여초 내외지만,
대상 엑셀파일을 PC에서 읽을때는 PC가 버벅되서 느리더군요.
암튼. 몇 백만건을 뽑아도 끄떡없게 아키텍쳐를 구성하면 됩니다.

우선, XML형태로 excel을 뿌려줍니다.
     MicroOffice의 xml을 사용하시면 됩니다.

둘째로, 엑셀을 추출하는 데이터를 Stream으로 바로 싸주어야쥐 WAS가 죽지 않습니다.

셋째는, 대용량 데이터를 추출해서 뿌리면 느리기 때문에
   DB 조회시 fetch size를 증가시켜 WAS와 DB사이의 네트웍 트래픽을 줄여주면
   놀라운 성능향상을 기대할 수 있습니다.
   (보통 Oracle인 경우, fetch size가 default로 10이죠. 이걸 1,000 ~2,000 사이로 주어주면 됩니다)

도움이 되셨을지 모르겠네요 ^^

2010년 12월 23일 오전 9:38, Sungchul Park <gyu...@gmail.com>님의 말:

미랭군

unread,
Dec 22, 2010, 8:09:42 PM12/22/10
to Korea Spring User Group
이 방식도 기존에 했었는데

첫번째 문제는 속도가 상당히 느리다는 것

두번째 문제로 용량이 엄청나게 큽니다 ㅠ

On 12월22일, 오후3시24분, Sewon Ann <king...@gmail.com> wrote:
> 며칠전 4만건 정도는http://jexcelapi.sourceforge.net/로 무리없이 작업했습니다.


> 메모리가 생성에 드는 메모리를 말씀하시는 거라면, html 로 만들어보시는 건 어떨까요.
>
> 하도 예전에 작업해서 지금 저에게 소스가 없지만, 아래 링크 참고해서 작업해 보세요.http://www.designdetector.com/archives/05/07/HTMLToExcelTheEasyWay.php
>
> <http://www.designdetector.com/archives/05/07/HTMLToExcelTheEasyWay.php>데이터는
> html 로 만들고, 이걸 엑셀에서 열어보면 엑셀 형식으로 잘 보입니다.
>
> 이도 저도 안되면 아얘 .csv 로 만들어보시는 최후의 대안도 있지 않을까 싶네요.
>

> 2010/12/22 미랭군 <devzer...@gmail.com>


>
>
>
> > 프로젝트를 진행하다보니..대용량 데이터를 Excel로 다운받게 해달라는 요청이 들어와서..
>
> > 며칠 동안 고민의 고민을 거듭하고 있네요;;
>
> > Spring과는 별개의 문제지만 혹시나 하는 마음에 글 올려봅니다^^;;
>
> > 6만건 이상의 데이터를 POI나 JXL등으로 Excel을 생성하려고 하니 메모리 부족으로
>
> > 뻗어버리는 현상이 일어나는데 혹시 대용량 데이터 Excel 다운로드 시 좋은 해결방법을
>
> > 알고 계신 분 계신가요?
>
> > --
> > Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> > 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.

> > 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com<ksug%2Bunsu...@googlegroups.com>로
> > 이메일을 보내주세요.
> > 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Sungchul Park

unread,
Dec 22, 2010, 8:10:26 PM12/22/10
to ks...@googlegroups.com

우선, XML형태로 excel을 뿌려줍니다.
     MicroOffice의 xml을 사용하시면 됩니다.

전 새 OOXML포멧을 스트리밍으로 만들어주는 라이브러리를 찾다가 못 찾았는데 직접 XML을 생성하셨군요. 역시 도구에 너무 얽매여 사는 듯 합니다. ^^

메모리 문제는 이걸로 해결이 되겠네요.

좋은 정보 감사합니다.

2010년 12월 23일 오전 9:38, Sungchul Park <gyu...@gmail.com>님 의 말:
저도 다른 분들과 비슷한 의견인데요. 정리를 한번 해봤습니다.

1) 액셀이 대용량 데이터 처리에 적합한가?
저는 그렇지 않다고 봅니다. DB와 표 계산 프로그램은 엄연히 용도가 다르죠.

대안
  1. 데이터를 작은 단위로 나눠 여러 파일로 만들어 내려받게 처리

2) 액셀 파일이 스트리밍을 지원하는가?

액셀 파일은 완성될 때까지 메모리에 모든 데이터를 보유해야합니다. DB에서 한 줄씩 읽어서 클라이언트로 바로 출력하고 메모리에는 최소한의 데이터만 남겨두는 식으로 처리할 수 없습니다.

대안
  1. 충분한 메모리를 확보.
    윈도우에서 돌아가는 엑셀 자체도 6만라인이 들어있는 시트를 열려면 메모리를 엄청나게 많이 사용할 듯 합니다. 그러니 서버 사이드에도 그에 상응하는 (어쩌면 더 많은) 메모리를 할당해야겠죠.
  2. 엑셀 포멧이 아닌 HTML 또는 CSV를 고려.
    HTML이나 CSV는 DB에서 데이터를 읽으면서 바로 출력할 수 있으니까요. mime type만 적절하게 지정하면 바로 엑셀이 데이터를 받도록 할 수도 있습니다.

프로젝트를 진행하다보니..대용량 데이터를 Excel로 다운받게 해달라는 요청이 들어와서..

며칠 동안 고민의 고민을 거듭하고 있네요;;

Spring과는 별개의 문제지만 혹시나 하는 마음에 글 올려봅니다^^;;


6만건 이상의 데이터를 POI나 JXL등으로 Excel을 생성하려고 하니 메모리 부족으로

뻗어버리는 현상이 일어나는데 혹시 대용량 데이터 Excel 다운로드 시 좋은 해결방법을

알고 계신 분 계신가요?


--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으) 로 이메일을 보내세요.

그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에 서 그룹을 방문하세요.

손찬욱

unread,
Dec 22, 2010, 8:11:34 PM12/22/10
to ks...@googlegroups.com
용량은 커지지만,
아래 fetch size를 늘려서 데이터를 받으면 속도 이슈는 없더군요 ㅋ
저희 프로젝트는 지금 그렇게 쓰고 있어요 ㅋ

2010년 12월 23일 오전 10:09, 미랭군 <devz...@gmail.com>님의 말:

Sewon Ann

unread,
Dec 22, 2010, 8:12:38 PM12/22/10
to ks...@googlegroups.com
가장 훌륭한 해결책이라고 생각합니다.
고맙습니다~!

2010/12/23 손찬욱 <scu...@gmail.com>

미랭군

unread,
Dec 22, 2010, 8:13:02 PM12/22/10
to Korea Spring User Group
아 답변의 답변이 안되는군여. 위에 속도 문제와 용량 문제는 HTML이용 Excel생성 방식에서

발생하는 문제들입니다. XML 직접 생성은 한번 해봐야겠군요^^;;

많은 답변과 관심 감사합니다.

On 12월23일, 오전10시10분, Sungchul Park <gyu...@gmail.com> wrote:
> > 우선, XML형태로 excel을 뿌려줍니다.
> > MicroOffice의 xml을 사용하시면 됩니다.

> >http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats#Excel_XML_S...


>
> 전 새 OOXML포멧을 스트리밍으로 만들어주는 라이브러리를 찾다가 못 찾았는
> 데 직접 XML을 생성하셨군요. 역시 도구에 너무 얽매여 사는 듯 합니다. ^^
>
> 메모리 문제는 이걸로 해결이 되겠네요.
>
> 좋은 정보 감사합니다.
>
>
>
> > 2010년 12월 23일 오전 9:38, Sungchul Park <gyu...@gmail.com

> > <mailto:gyu...@gmail.com>>님 의 말:


>
> > 저도 다른 분들과 비슷한 의견인데요. 정리를 한번 해봤습니다.
>
> > 1) 액셀이 대용량 데이터 처리에 적합한가?
> > 저는 그렇지 않다고 봅니다. DB와 표 계산 프로그램은 엄연히 용도가
> > 다르죠.
>
> > 대안
>

> > 1. 데이터를 작은 단위로 나눠 여러 파일로 만들어 내려받게 처리


>
> > 2) 액셀 파일이 스트리밍을 지원하는가?
>
> > 액셀 파일은 완성될 때까지 메모리에 모든 데이터를 보유해야합니다.
> > DB에서 한 줄씩 읽어서 클라이언트로 바로 출력하고 메모리에는 최소한
> > 의 데이터만 남겨두는 식으로 처리할 수 없습니다.
>
> > 대안
>

> > 1. 충분한 메모리를 확보.


> > 윈도우에서 돌아가는 엑셀 자체도 6만라인이 들어있는 시트를 열
> > 려면 메모리를 엄청나게 많이 사용할 듯 합니다. 그러니 서버 사
> > 이드에도 그에 상응하는 (어쩌면 더 많은) 메모리를 할당해야겠죠.

> > 2. 엑셀 포멧이 아닌 HTML 또는 CSV를 고려.


> > HTML이나 CSV는 DB에서 데이터를 읽으면서 바로 출력할 수 있으
> > 니까요. mime type만 적절하게 지정하면 바로 엑셀이 데이터를
> > 받도록 할 수도 있습니다.
>
> >> 프로젝트를 진행하다보니..대용량 데이터를 Excel로 다운받게 해달라는 요청이 들어와서..
>
> >> 며칠 동안 고민의 고민을 거듭하고 있네요;;
>
> >> Spring과는 별개의 문제지만 혹시나 하는 마음에 글 올려봅니다^^;;
>
> >> 6만건 이상의 데이터를 POI나 JXL등으로 Excel을 생성하려고 하니 메모리 부족으로
>
> >> 뻗어버리는 현상이 일어나는데 혹시 대용량 데이터 Excel 다운로드 시 좋은 해결방법을
>
> >> 알고 계신 분 계신가요?
>
> > --
> > Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메
> > 일이 전송되었습니다.
> > 이 그룹에 게시하려면 ks...@googlegroups.com

> > <mailto:ks...@googlegroups.com>(으) 로 이메일을 보내세요.
> > 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com
> > <mailto:ksug%2Bunsu...@googlegroups.com>로 이메일을 보내주세요.


> > 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko
> > 서 그룹을 방문하세요.
>
> > --
> > Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이
> > 전송되었습니다.
> > 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> > 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내
> > 주세요.
> > 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그

Kuwon Kang

unread,
Dec 22, 2010, 8:22:28 PM12/22/10
to ks...@googlegroups.com
Demonstrates a workaround you can use to generate large workbooks and avoid OutOfMemory exception.

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java


도움이 되시길~~

2010/12/22 미랭군 <devz...@gmail.com>
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.




--
Blessings.
Kuwon Kang
............................................................
IT specialist and architect.
Java technology engineer.
JavaEE architect/developer.
Spring Framework specialist.
Solution developer.

- Model Driven Architecture.
- Test Driven Development.
- Test Driven Software Design.
- Refactoring Oriented Development.
- Practical design and modeling.
- Robust  Software Design and Engineering.
............................................................
Prever,Inc.
 http://www.prever.co.kr/
Blog:
 http://josh.prever.co.kr/
M 010 9440 9090
O 070 8682 0790
............................

............................................................

God's love is eternal and leads us to live for heaven and His glory

Sanghyuk Jung

unread,
Dec 23, 2010, 10:30:11 AM12/23/10
to ks...@googlegroups.com
 위에서 많은 분들이 설명을 하셨는데, OOXML이든, JSP에서 헤더를 바꾼 것이든 결국 outputstream으로 행 별로 text를 써야 메모리에 한꺼번에 올리지 않고 처리를 할 수 있습니다.

 DB조회에 Spring JDBC의 rowCallBackHandler나 iBatis의 rowHandler를 활용할 수 있을 듯 합니다.

2010년 12월 23일 오전 10:22, Kuwon Kang <preve...@gmail.com>님의 말:
Reply all
Reply to author
Forward
0 new messages