개발자

자바 대용량 txt파일 update, insert 처리

2024년 02월 27일조회 216

안녕하세요. 초보 자바 개발자 입니다 회사에서 대용량 수신파일에 대한 update, insert 처리 건을 업무로 받아서 개발 중에 있는데 대용량 파일에 대한 처리 업무는 처음이라 어떤 방식이 제일 베스트인가에 대한 결정이 어려워 질문 드립니다. 원본테이블에 존재하는 정보(소속, 이름, 주민, 회차(1~4 중 하나))를 수신받은 파일(주민, 회차(1~4중 하나), 회차에 대한 정보)을 읽어 원본테이블에 존재하는 정보의 회차와 수신 받은 파일의 회차가 같으면 update, 다른경우 insert해 한 명 당 4건의 정보(원본update 1건, insert 3건)를 가지게 해야합니다. 처음엔 PL로부터 약 10만명에 대한 정보만 입력되면 된다고 들어서 자바로 원본테이블 정보를 select 후 수신파일을 읽어 list<map>에 담고 for문을 통해+ 비교 후 원본에 존재하면 updateList에 존재하지 않으면 insertList에 담아 1000건씩 bulk insert, update 처리했습니다. 그런데 최대 40만명까지 늘어날 수 있다고 말이 바껴서... 그럼 수신 파일정보가 160만건인데 제 생각에는 temp table을 만들어서 수신파일정보를 전부 insert 후 원본테이블과 join하여 update, insert하는게 맞지 않을까하는데 조언 부탁드리겠습니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

김예지님의 프로필 사진

제 생각에는 아래 방법이 있을 것 같습니다. 1. 파일에서 데이터 로드할때 한번에 전체 로딩이 아닌, 버퍼로 읽고 사용후 버리는 방식 (=스트리밍 방식) - 자바 out of memory를 방지하기 위함입니다. - ex. 3000줄 단위로 읽고 처리후 버림. 2. upsert 쿼리 사용 - upsert쿼리란 insert를 수행하다가 pk 충돌나면 update를 수행하는 쿼리문입니다. - 데이터베이스 엔진마다 문법이 다릅니다.

profile picture

익명

작성자

2024년 03월 08일

답변 감사합니다. 도움이 되었습니다 :)

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 27일

안녕하세요. 여러 가지 접근 방법이 있을 수 있지만, 대용량 데이터를 처리하기 위해서는 성능 최적화가 중요하므로 추천하는 방식은 다음과 같습니다. 1. **Temp Table 사용**: 파일의 정보를 일시적인 테이블에 insert 한 후 원본 테이블과 join을 사용해 데이터를 update/insert 하는 것이 좋습니다. 이 방법은 SQL 쿼리로 빠르게 처리될 수 있으며 대용량 데이터 처리에 적합합니다. 2. **Batch Processing**: JDBC의 Batch 기능을 이용하여 많은 양의 데이터를 일괄 처리할 수 있습니다. 이렇게 하면 네트워크를 통한 요청 회수 줄임으로써 성능을 개선할 수 있습니다. 3. **스트리밍 처리**: 파일을 한 번에 읽는 것이 아니라 스트림으로 처리하면 메모리 사용량을 크게 줄일 수 있습니다. Java에서는 `BufferedReader`, `Scanner` 등의 클래스가 파일 스트리밍에 사용될 수 있습니다. 4. **Multi-Threading**: 여러 군데에서 동시에 데이터를 읽고 쓸 경우, 멀티스레딩을 고려해 볼만합니다. 작업 부하를 분산시키고 시스템의 효율성을 높이기 위해 Multi-Threading를 사용할 수 있지만, 디버깅과 유지 관리가 복잡해질 수 있으므로 주의하셔야 합니다. 예상되는 데이터 양에 대비하여 올바른 자료 구조를 선택하고 적절한 인덱스를 설정하는 것도 중요합니다. 이러한 방식들은 정확한 결과를 얻기 위해 세심한 테스트와 튜닝이 필요합니다. 기존 코드의 유지보수와 확장성을 고려해서 가장 효율적인 방법을 선택하시면 됩니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!