File.Stream

File.Stream

File.stream!/3가 돌려주는 **스트림 구조체(struct)**예요. 파일을 한 번에 통째로 읽지 않고, 필요한 만큼 조금씩 읽어 처리하고 싶을 때 사용해요.

다음 필드들이 공개되어 있어요.

  • path — 파일 경로예요.
  • modes — 파일 모드예요.
  • raw — 바이너리 계열(bin 접두사) 함수를 쓸지를 알려주는 불리언이에요.
  • line_or_bytes — 줄 단위로 읽을지, 아니면 지정한 바이트 수만큼 읽을지 결정해요.
  • node — 파일이 속한 노드예요.

출처: File.Stream

본문

보통 파일을 그냥 읽을 때는 File.read/1로 한 번에 내용을 가져와요. 그런데 파일이 아주 크다면(ex: 로그 파일, 대용량 데이터 파일) 전부 메모리에 올리는 게 부담스러울 수 있어요. 그럴 때 File.stream!/3로 파일을 열면 File.Stream 구조체가 만들어지고, 이를 Enum이나 Stream과 함께 쓰면서 row 단위로 하나씩 처리할 수 있어요.

각 필드가 하는 일을 간단히 살펴볼게요.

  • path는 읽을 파일의 위치를 담아요.
  • modes는 파일을 열 때 사용할 모드 목록이에요. 인코딩이라든가 바이너리 여부 같은 설정이 여기에 들어가요.
  • rawtrue면 바이너리 계열 함수(read, write, ...)를 쓰고, false면 유니코드 문자 계열 함수를 써요.
  • line_or_bytes는 스트림이 줄 단위로 읽을지, 아니면 지정한 바이트 수 단위로 읽을지를 정해요. 예를 들어 줄 단위로 읽으면 텍스트 파일을 한 줄씩 처리하기 좋아요.
  • node는 분산 환경에서 파일이 어떤 노드에 속해 있는지를 나타내요. 분산 시스템을 쓰지 않는 동안에는 크게 신경 쓸 필요가 없는 필드예요.

스트림을 실제로 소비하는 것은 Enum.map/2 같은 함수가 담당해요. 스트림은 그 자체가 데이터를 전부 미리 읽어 두지 않고, 소비할 때 필요한 만큼만 읽기 때문에 큰 파일을 다룰 때 메모리 사용량을 크게 줄여줘요.

더 알아보기

  • File.stream!/3의 동작과 옵션을 함께 살펴보는 게 가장 좋아요.
  • 지연 평가(lazy evaluation) 개념은 Stream 모듈 문서에서 자세히 다뤄요.
  • 파일 모드에 대한 자세한 내용은 File.open/2 문서를 참고해 보세요.