How to Read Large Files in Chunks Using Python Generators
# 주요 개념 요약
**분류**: 프로그래밍/소프트웨어 개발
**대상 사용자**: 대규모 데이터 처리를 필요로 하는 파이썬 개발자

## 핵심 내용
- **메모리 효율성**: 대량의 파일(예: 수십GB)은 메모리에 전체 로드하는 대신 **버퍼 단위로 분할 읽기**하는 것이 권장됨.
- **제너레이터 활용**: `IOBase` 타입의 파일 핸들을 사용해 **생성자(generator)**를 통해 **차단 단위(chunk)**로 읽고, **구분자(delimiter)**를 기준으로 처리.
- **핵심 함수**: `reader()` 함수는 `bytearray`와 `index()` 메서드를 활용해 **바이트 단위로 읽은 후 문자열로 변환**하여 처리.
- **파라미터**: `chunk_size` (기본값: 8192)로 버퍼 크기 조절, `delimiter` (기본값: `\n`)로 행 단위 처리 가능.

## 세부 내용
### 1. 대량 파일 처리 문제점
- **메모리 부족**: 전체 파일을 리스트로 로드하면 메모리 사용량이 급격히 증가.
- **성능 저하**: 메모리에 데이터를 로드한 후 `split()` 처리 시, **초대규모 리스트 생성**으로 성능 저하.
- **파이썬 공식 문서 권장사항**: `range()` 대신 제너레이터 사용 권장 (예: 백만 번 루프 시 리스트 대신 `range` 활용).

### 2. 제너레이터 기반 해결 방안
- **버퍼 단위 읽기**: `chunk_size`로 파일을 분할해 읽고, `delimiter`를 기준으로 **실시간 처리**.
- **예시 코드**:
  ```python
  def reader(f: IOBase, delimiter: str='\n', chunk_size=8192):
      buffer = bytearray()
      delim = delimiter.encode()
      while True:
          chunk = f.read(chunk_size)
          if not chunk:
              yield buffer.decode()
              return
          buffer.extend(chunk)
          # 구분자 처리 로직
  ```
- **활용 사례**: `open()` 함수의 기본 `line` 단위 처리도 가능 (예: `for line in f:`).

## 결론
- **효율적인 대량 파일 처리**: 제너레이터를 활용한 **차단 단위 읽기**는 메모리 사용량을 최소화하고, 대규모 데이터 처리 시 필수적.
- **추천 실무 팁**:
  - `IOBase` 타입의 파일 핸들을 사용해 유연한 처리.
  - `open()`의 기본 `line` 단위 처리도 간단한 경우에 적합.
  - `chunk_size`는 시스템 메모리와 처리 속도에 따라 조정 필요.