JAVA에서 10만건 엑셀을 읽어서 DB에 넣어주고 싶습니다.

|

제목: JAVA에서 10만건 엑셀을 읽어서 DB에 넣어주고 싶습니다. - 초보 - 20
분류: 질문
이름: 시그시끄 ( 포인트:7535, 가입일:2012-03-30 )


등록일: 2014-11-19 10:58
조회수: 3579 / 추천수: 1




이 글(사진)을 추천 하신분들(1명)
익명할래요

    현재 구현하고 싶은것은 엑셀의 내용을 DB에 저장하는 것입니다.

    POI 를 이용해서 몇천건 정도의 엑셀은 1~2분내에서 읽고 DB에 저장까지 됩니다.


    그런데 문제는 엑셀에 10만건 가량의 row가 있을때는 heap memory error 가 뜨네요 ㅠㅠ

    이클립스 메모리도 늘려줘봤는데 읽을 수가 없네요.


    XML로 파싱을 하든가. 객체에 바인딩해서 처리하려고 해도 먼저 엑셀을 읽어야 파싱을 하든 뭘 할텐데, 메모리 에러만 뜰 뿐 진행을 할 수가 없네요. 아직 CSV는 알아보지는 않았지만 만약 CSV로 읽을 수 있다면 그 방법이 최선일까요?

    개발자분들의 조언 부탁드립니다.

    읽어주셔서 감사합니다!!
    [ 주소복사 http://www.ppomppu.co.kr/zboard/view.php?id=developer&no=14020 ]

    추천 1

    다른 의견 0

    추천 elf2lf
    데이터가 어떤지 잘 모르겠지만
    힙 에러라
    데이터가 안되면 가상 메모리 사용하면 될텐데
    직접 컨트롤이 안되는 자바의 문제인것 같네요
    C로 하면 메모리 지정해서 확인할 수 있을텐데
    C를 이용해서 해보시고 가능하면 C로 DLL을 만들어서 사용하면 어떨까요
    2014-11-19
    11:04:24

    [덧글]

    추천 시그시끄
    답변 감사드립니다.
    C로 DLL 만드는것 까지는 아직 제가 부족하네요.
    시간 날 때 한번 찾아보겠습니다.
    2014-11-19
    12:06:21

    [덧글]

    추천 추억만이
    아래쪽에 내려가다보면 해당 내용이 있는 것 같네요
    http://www.coderanch.com/t/424181/open-source/Read-xls-xlsx-file-format
    2014-11-19
    11:20:43

    [덧글]

    추천 시그시끄
    읽어보겠습니다. 감사합니다.
    2014-11-19
    12:06:47

    [덧글]

    추천  메뉴
    액셀 임포트 작업이 빈번하게 있나요?
    2014-11-19
    11:19:55

    [덧글]

    추천 시그시끄
    임포트 작업이라는게 INSERT 하는 부분 말씀하시는건가요?
    2014-11-19
    12:09:43

    [덧글]

    추천 LECHUCK
    아마도 POI에서 엑셀의 모든 데이터를 메모리에 올린 다음 작업을 하기 때문에 그런거 같은데요.
    먼저 이클립스 메모리가 아니라 애플리케이션 실행시 JVM에 넘겨줘야하는 -Xmx 옵션을 사용해서 메모리를 늘려줘 보시구요.
    그래도 메모리 부족이 뜬다면 모두 메모리에 올리기에는 전체 데이터가 너무 크기 때문에
    csv 파일로 해서 블럭단위로 읽으면서 DB에 추가하면 될 거 같습니다.
    아니면 xml로 한다면 DOM 대신 SaxParser를 사용해야겠죠.
    2014-11-19
    11:25:17

    [덧글]

    추천 시그시끄
    SaxParser로 파싱하려면 먼저 엑셀을 읽어야 되지 않나요?
    2014-11-19
    12:06:26

    [덧글]

    추천 귀린.
    원하시는 답변이 아니긴 한데 엑셀 몇천건을 임포트 하는데 1~2분이나 걸리나요? 1,2초면 끝나는데..
    뭔가 소스도 다시 한번 봐야 될듯 한데요..설마 쿼리문을 계속해서 돌리면서 추가하는건 아니죠?
    2014-11-19
    11:28:55

    [덧글]

    추천 시그시끄
    흠 지금 1000건씩 나눠서 ibatis 배치로 쿼리 돌리고 있는데 문제가 있는건가요?
    2014-11-19
    12:05:20

    [덧글]

    추천 토루토루
    윗분 말씀대로 이클립스 메모리 말고 run 실행 설정에서 -Xmx 옵션으로 메모리 설정하시면 될 듯 합니다.
    그리고 단순 DB Insert 라면 건별로 업데이트 하지 마시고 addBatch 이용해서 최소 천건단위로 insert 하세요.
    10만건을 정해진 시간(예 : 5초 이내) 안에 처리해야 되는게 아니라면 위 내용만으로도 작업에는 큰 문제 없어 보입니다.
    2014-11-19
    11:54:40

    [덧글]

    추천 시그시끄
    만약 10만건을 5초 이내에 올려야 되는 상황이 되면 다른 방법을 써야 하나요?
    댓글 읽고 갑자기 궁금해지네요
    2014-11-19
    12:09:08

    [덧글]

    추천 1 귀린.
    대용량 업데이트를 이용해야죠.. 검색해보니 나오네요.참고해보세요.
    http://fruitdev.tistory.com/111
    2014-11-19
    14:35:59


    추천 토루토루
    사실 addBatch를 이용하여 대용량 처리를 하더라도 특정 시간안에 모든 작업을 처리해야 되는경우에는
    싱글 스레드로 실행시 어느정도 한계가 있습니다. (제 생각)

    저의 경우 대용량 처리를 할때에는 멀티스레드로 데이터의 각 범위를 정해서 addBatch를 이용하였습니다.
    2014-11-19
    18:19:01


    추천 봄-봄
    DB에 맞는 loader 프로그램을 내부에서 호출해서 쓰세요.
    2014-11-19
    12:33:43

    [덧글]

    추천 추억만이
    이게 가장 현실적이고 가장 빠르고 가장 최고의 정답..
    2014-11-20
    12:35:16

    [덧글]

    추천 현자
    트랜잭션은 어떻게 되나요?
    트랜잭션을 개별 단위로 처리 하면 메모리 문제가 수월하긴 합니다만
    트러블 슈팅이 좀 난감해지죠.
    2014-11-19
    13:22:23

    [덧글]

    추천 익명할래요
    2년전인가.. 신입때

    파일로된 190만 라인, 100~150MB 짜리의 텍스트 파일을 DB 인서트 한적있었는데.

    저도 같은 증상 있었습니다.

    파싱 완료 -> 인서트 하는 과정에서

    파싱하다보니 변수에 데이터를 담아야 하는데 점점 많아 지면서

    힙스페이스 오류가 나는 상황이었는데요.

    1000건씩 파싱 -> 인서트 반복해서 해결했네요.

    saxparser도 찾아보니

    라인별 파싱이라고 하는데요.

    같은 방식으로 진행하면 되지 않을까 합니다.
    2014-11-19
    13:34:17

    [덧글]

    추천 푸우날쎄
    이전 프로젝트 중에 하루 교통카드데이터(서울기준, 일 하루 약 이천만건)를
    일주일 치 정도 한번에 올린적이 있었는데,
    그 때는 CSV 파싱 오픈 소스 이용해서, 읽어 들이고, 만건씩 AddBatch 사용해서
    커밋 했었습니다. 2천 만건 기준으로 약 6분 정도 소요되었던 것으로
    기억합니다.
    2014-11-19
    15:02:29

    [덧글]

    추천  달팽달팽
    java nio 써서 버퍼사이로 끊어서 리드하세요

     

     

    http://www.ppomppu.co.kr/zboard/view.php?id=developer&no=14020

    And