본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 기가바이트급 대용량 데이터 처리 해결 : mmap 활용 방법과 일반 I/O의 3가지 차이

by Papa Martino V 2026. 2. 28.
728x90

mmap 활용 방법
mmap 활용 방법

 

데이터 사이언스와 백엔드 엔지니어링 분야에서 기가바이트(GB) 혹은 테라바이트(TB) 단위의 파일을 다루는 것은 일상적인 과제가 되었습니다. 하지만 파이썬의 일반적인 read()readlines() 방식을 사용하여 큰 데이터를 메모리에 올리려 하면 곧바로 MemoryError를 마주하게 됩니다. 이를 우아하게 극복할 수 있는 치밀한 방법이 바로 메모리 맵 파일(Memory-mapped File, mmap)입니다. 본 글에서는 OS 레벨의 메모리 관리 기법을 파이썬에 녹여내어 성능을 극대화하는 전략을 분석합니다.


1. mmap이란 무엇인가? (개념과 원리)

mmap은 디스크에 있는 파일의 내용을 프로세스의 가상 메모리 주소 공간에 직접 매핑하는 기술입니다. 파일을 마치 메모리에 올라와 있는 거대한 '바이트 배열'처럼 취급할 수 있게 해주며, 실제 데이터의 로딩은 OS의 Demand Paging(요구 페이징) 메커니즘에 의해 필요할 때만 물리 메모리로 로드됩니다.


2. mmap vs 일반 File I/O의 결정적 차이 3가지

왜 대용량 데이터 처리에서 mmap이 압도적인 성능 차이를 보이는지 핵심 지표를 통해 비교합니다.

비교 항목 일반적인 File I/O (read/write) 메모리 맵 I/O (mmap)
데이터 복사 횟수 2회 (디스크 → 커널 버퍼 → 유저 공간) 1회 미만 (Zero-copy 지향)
메모리 점유 방식 파일 크기만큼 메모리 즉시 할당 필요 가상 메모리만 할당 (실제 점유 최소화)
접근 방식 순차 접근 위주 (Random Access 시 seek 오버헤드) 배열 인덱싱을 통한 즉각적인 Random Access
멀티 프로세싱 파일 락(Lock) 관리 복잡 공유 메모리를 통한 프로세스 간 데이터 공유 용이

3. 큰 데이터를 다룰 때 mmap이 유리한 구체적 이유

첫째, 성능 최적화: Zero-copy 매커니즘

일반적인 파일 읽기는 커널 공간의 데이터를 유저 공간의 버퍼로 복사하는 과정을 거칩니다. 반면 mmap은 유저 공간에서 커널 버퍼에 직접 접근하는 효과를 주어 컨텍스트 스위칭과 데이터 복사 비용을 획기적으로 줄여줍니다.

둘째, 효율적인 Random Access (임의 접근)

수십 GB 파일의 끝부분에 있는 10바이트를 읽기 위해 전체를 탐색할 필요가 없습니다. mmap 객체는 슬라이싱(mm[100:110])을 지원하므로 필요한 페이지만 OS가 메모리로 올려 처리합니다.

셋째, 가상 메모리의 마법

실제 RAM이 8GB뿐이라도 100GB 파일을 매핑할 수 있습니다. OS가 똑똑하게 자주 사용되는 부분은 남기고 사용되지 않는 부분은 페이지 아웃(Page-out)시키며 메모리 압박을 해결하기 때문입니다.


4. Sample Example: mmap을 이용한 대용량 파일 검색

다음은 수 기가바이트의 로그 파일에서 특정 패턴을 고속으로 찾는 실전 활용 방법입니다.


import mmap
import os

def search_large_file(filename, search_str):
    with open(filename, "r+b") as f:
        # 파일 전체를 메모리에 매핑 (가상 메모리만 할당됨)
        with mmap.mmap(f.fileno(), 0) as mm:
            # find() 메서드는 파일 전체를 메모리에 로드하지 않고 검색 수행
            index = mm.find(search_str.encode())
            
            if index != -1:
                print(f"패턴 발견 위치: {index}")
                # 발견된 위치 주변 데이터 읽기 (슬라이싱 지원)
                context = mm[index:index+50]
                print(f"주변 데이터: {context}")
            else:
                print("패턴을 찾을 수 없습니다.")

# 사용 예시 (10GB 파일도 순식간에 검색 가능)
# search_large_file("huge_log_file.log", "ERROR_CODE_500")

5. mmap 사용 시 주의사항 및 해결책

  • 파일 크기 고정: 매핑된 이후 파일 크기가 변하면 예외가 발생할 수 있습니다. 크기 변경이 잦은 가변 데이터보다는 정형화된 거대 로그나 바이너리 데이터에 적합합니다.
  • 바이너리 모드: 파이썬의 mmap은 기본적으로 바이너리 데이터를 다룹니다. 텍스트 처리가 필요하다면 인코딩/디코딩 과정을 효율적으로 설계해야 합니다.
  • 64비트 환경 권장: 32비트 OS는 주소 공간의 한계(약 4GB)로 인해 대용량 파일 매핑에 제한이 있습니다. 현대의 64비트 시스템에서는 사실상 무제한에 가깝습니다.

6. 결론

파이썬의 mmap 모듈은 복잡한 OS 레벨의 시스템 콜을 개발자가 아주 익숙한 파이썬 인터페이스로 다룰 수 있게 해주는 강력한 무기입니다. 메모리 효율과 데이터 처리 속도라는 두 마리 토끼를 잡아야 하는 상황이라면, mmap은 선택이 아닌 필수적인 해결책입니다. 대규모 데이터 파이프라인 설계 시 일반 I/O와 mmap의 차이를 명확히 인지하고 적용해 보시기 바랍니다.


글 내용의 출처 및 기술 참조

  • Python Official Docs: mmap — Memory-mapped file support
  • Advanced Programming in the UNIX Environment (W. Richard Stevens)
  • Linux Programmer's Manual: man mmap(2)
  • High Performance Python (O'Reilly Media): "Fast I/O with mmap"
728x90