대용량 CSV 파일 병합 및 전처리 | Pandas 메모리 초과 에러 해결 로직
대용량 CSV 파일 병합 및 전처리 | Pandas 메모리 초과 에러 해결 로직
수십 기가바이트의 데이터를 분석하다가 멈춰버린 노트북 화면을 보며 막막했던 경험, 저도 데이터 분석 업무를 하면서 정말 자주 겪었거든요. 2026년 현재 가장 효율적으로 메모리를 관리하며 CSV를 병합하는 방법, 제가 쓴 노하우를 담아 알려줄게!
💡 핵심 요약
chunksize 활용으로 10GB 파일도 500MB 단위씩 분할 처리 가능
데이터 타입을 int64에서 int32 등으로 축소하여 메모리 점유율 50% 이상 절감
병합 전 불필요한 컬럼 삭제로 처리 시간 40% 단축
1. 📊 메모리 초과 에러의 근본 원인
Pandas는 기본적으로 데이터를 RAM에 전부 올리는 인메모리 방식을 사용해요. 그래서 파일 크기가 5GB라면 RAM은 최소 15GB 이상의 여유가 있어야 안정적으로 돌아간답니다. 2026년 현재 일반적인 업무용 PC 사양인 16GB RAM 환경에서는 5GB 이상의 CSV만 되어도 시스템 전체가 느려지거나 MemoryError가 발생하는 것이죠.
💡 꿀팁! 작업 관리자에서 파이썬 프로세스의 메모리 점유율을 띄워두고, 사용률이 80%를 넘어가면 즉시 청크 처리 방식으로 코드를 수정하는 게 좋아요.
2. 🚀 Chunksize로 메모리 폭탄 피하기
한꺼번에 파일을 읽지 말고 chunksize 옵션을 사용해 보세요. 예를 들어 chunksize=100000으로 설정하면 10만 줄씩 데이터를 끊어서 가져오기 때문에 메모리 소모를 일정하게 유지할 수 있거든요. 이렇게 잘게 나눈 데이터들을 반복문으로 돌면서 필요한 병합 작업만 수행하면 시스템 다운 현상 없이 무사히 완료할 수 있어요.
⚠️ 주의사항: 너무 작은 청크 단위(예: 1,000줄 이하)로 설정하면 병합 횟수가 늘어나 전체 작업 속도가 현저히 느려질 수 있어요.
3. 🧩 데이터 타입 최적화로 효율 높이기
Pandas는 숫자를 기본적으로 64비트로 할당하는데, 데이터가 작다면 int32나 float32로만 바꿔도 메모리를 즉시 절반으로 줄일 수 있어요. df.info()를 실행해 데이터의 범위를 확인하고, astype() 함수로 타입을 강제 조정해 보세요. 이런 작은 습관이 1억 건 이상의 데이터를 다룰 때 엄청난 속도 차이를 만든답니다.
💡 꿀팁! 'category' 타입을 활용해 보세요. 중복이 많은 텍스트 컬럼(예: 지역명, 성별 등)을 'category'로 변환하면 메모리 점유율을 최대 90%까지 줄일 수 있거든요.
4. 🛠️ 불필요한 데이터는 즉시 삭제
데이터를 불러온 직후 usecols 파라미터를 사용하여 필요한 컬럼만 추출하세요. 100개의 컬럼 중 분석에 5개만 필요하다면, 처음부터 나머지를 빼고 불러오는 게 메모리 관리에 가장 효과적이에요. 불필요한 변수는 del 명령어를 쓰고 gc.collect()를 호출하여 메모리 공간을 즉시 확보하는 것도 잊지 마세요.
5. 🔄 병합 전략의 핵심 : 키값 관리
대용량 데이터를 병합할 때는 인덱싱(Index)이 생명이에요. 병합 기준이 되는 컬럼을 인덱스로 설정하면 merge 속도가 훨씬 빨라지거든요. 2026년 버전 Pandas 기준으로 sort=False 옵션을 함께 쓰면 정렬에 드는 추가 연산 비용을 30% 정도 아낄 수 있어서 성능 향상에 큰 도움이 된답니다.
💡 꿀팁! 여러 CSV를 한꺼번에 병합해야 한다면, 리스트에 담아 pd.concat()을 한 번만 사용하는 것이 하나씩 merge하는 것보다 훨씬 빠르답니다.
6. 💻 제 개인적인 작업 방식
사실 저는 처음에 무작정 pd.read_csv()로 전체를 올리려다 코랩(Colab) 세션을 수십 번 날렸던 기억이 있어요. 결국 지금은 데이터 규모가 5GB를 넘어가면 무조건 chunksize를 쓰거나, 아예 Polars 라이브러리로 넘어가서 작업하는 편이에요. 덕분에 이제는 메모리 터질 걱정 없이 퇴근 전 일괄 처리를 걸어두고 마음 편히 있을 수 있답니다.
❓ 자주 묻는 질문
Q. 10GB 넘는 파일은 어떤 라이브러리가 제일 빠를까요?
2026년 기준으로는 폴라스(Polars)가 가장 빠르답니다. 멀티 코어를 완벽하게 활용하여 Pandas보다 처리 속도가 5~10배 정도 빠르거든요.
Q. 메모리 초과 시 에러 메시지는 주로 어떻게 나오나요?
대부분 'MemoryError' 혹은 'Out of memory'라는 문구가 뜹니다. 드물게는 OS에서 프로세스를 강제 종료시키기도 해요.
Q. chunksize는 어느 정도가 적당한가요?
파일 형태에 따라 다르지만 보통 10만에서 50만 건 사이를 권장합니다. 메모리를 500MB 단위로 점유하는 선에서 조정해 보세요.
Q. 데이터를 쪼개서 병합하면 결과가 달라질 수 있나요?
아니요, 단순히 메모리 로드 방식의 차이일 뿐 결과값은 동일합니다. 단, 병합 시 정렬 순서만 주의하면 됩니다.
Q. 인덱싱을 하면 메모리를 더 쓰지 않나요?
인덱스 생성 시 메모리가 약간 추가되지만, 데이터 탐색(Search) 속도가 획기적으로 빨라져 전체 작업 시간을 50% 이상 단축할 수 있어요.
Q. 2026년 현재 Pandas의 대안은 무엇인가요?
대용량 데이터를 다룰 때는 Dask 혹은 Polars 사용이 일반적입니다. 특히 100GB 단위라면 Dask로 분산 처리를 하는 것이 정석이에요.
작성자: 로그
파이썬을 활용해 웹 스크래핑과 업무 자동화 프로그램을 개발하며 디지털 자산을 키워가는 평범한 직장인입니다. 반복되는 작업은 코드에 맡기고, 실무에서 직접 부딪히며 얻은 구체적인 문제 해결 노하우를 기록하고 공유합니다.
댓글
댓글 쓰기