Python에서 파일을 열 때 버퍼 크기 지정하기
Python에서 파일을 열 때 버퍼(buffer) 크기를 직접 지정하려면 내장 함수 open()의 세 번째 인자인 buffering 매개변수를 사용하면 됩니다. 이 값에 따라 파일 입출력 성능과 동작 방식이 달라질 수 있습니다.
Python 2에서의 버퍼링 지정
Python 2의 open() 함수 정의는 다음과 같습니다.
open(name[, mode[, buffering]])
세 번째 인자인 buffering은 파일에 적용할 원하는 버퍼 크기를 지정하는 선택적 인자입니다.
- 0: 버퍼링 없음(unbuffered)
- 1: 라인 단위 버퍼링(line buffered)
- 양수: 해당 값(바이트)을 크기로 하는 버퍼 사용
- 음수: 시스템 기본값 사용 (tty 장치는 라인 버퍼링, 그 외 파일은 전체 버퍼링)
이 인자를 생략하면 시스템 기본값이 적용됩니다.
예를 들어, 버퍼 크기가 128바이트인 파일을 열고 싶다면 다음과 같이 작성합니다.
>>> open('my_file', 'r+', 128)Python 3에서의 버퍼링 지정
Python 3에서 open() 함수의 정의는 다음과 같습니다.
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
buffering은 버퍼링 정책을 설정하는 선택적 정수 인자입니다.
- 0: 버퍼링 비활성화 (바이너리 모드에서만 허용)
- 1: 라인 버퍼링 선택 (텍스트 모드에서만 사용 가능)
- 1보다 큰 정수: 고정 크기 청크(chunk) 버퍼의 바이트 크기 지정
buffering 인자를 지정하지 않으면 기본 버퍼링 정책이 다음과 같이 동작합니다.
- 바이너리 파일은 고정 크기 청크 단위로 버퍼링됩니다. 버퍼 크기는 하위 장치의 "블록 크기(block size)"를 추정하는 휴리스틱으로 결정되며, 판단할 수 없는 경우
io.DEFAULT_BUFFER_SIZE로 대체됩니다. - "대화형(interactive)" 텍스트 파일(
isatty()가True를 반환하는 파일)는 라인 버퍼링을 사용하고, 그 외의 일반 텍스트 파일은 위의 바이너리 파일과 동일한 정책을 따릅니다.
사용 예시는 Python 2와 동일합니다. 예를 들어, 버퍼 크기가 128바이트인 파일을 열려면 다음과 같이 작성합니다.
>>> open('my_file', 'r+', 128)