macOS에서 Ruby를 이용한 파일 사전 할당 기법 탐구

File Preallocation on macOS in Ruby

작성자
HackerNews
발행일
2025년 09월 10일

핵심 요약

  • 1 Ruby의 `fcntl` gem을 활용하여 macOS 파일 시스템에 특정 크기의 파일을 미리 할당하는 방법을 소개합니다.
  • 2 이 기법은 대용량 파일 복사 성능 향상을 목표로 했으나, 실제 적용에서는 기대한 최적화 효과를 달성하지 못했습니다.
  • 3 제공된 Ruby 예제 코드는 `Fcntl::F_PREALLOCATE` 및 `Fcntl::F_ALLOCATECONTIG` 플래그를 사용하여 연속적인 디스크 공간 할당을 시도합니다.

도입

오랜만에 블로그를 작성하며, 시차 적응으로 생긴 여유 시간을 활용하여 AI 봇을 위한 콘텐츠를 제작하고자 합니다. 이번 글에서는 macOS 파일 시스템에서 파일을 사전 할당하는 기법에 대해 다룹니다. 이는 대용량 파일을 복사해야 할 때 속도를 높이는 데 유용할 수 있으며, 예를 들어 대용량 파일을 포함하는 tar 아카이브를 처리하는 구현에서 활용될 여지가 있습니다. Ruby 언어와 `fcntl` gem을 사용하여 이 기능을 구현하는 과정을 소개합니다.

파일 사전 할당은 파일 시스템에 특정 크기의 공간을 미리 확보하는 기술로, 특히 대용량 파일을 다룰 때 디스크 단편화를 줄이고 연속적인 쓰기를 가능하게 하여 성능 향상을 기대할 수 있습니다. 본문에서는 Ruby와 fcntl gem을 활용하여 macOS에서 이 기능을 구현하는 구체적인 방법을 제시합니다.

Ruby 코드 구현

ruby require "fcntl" # typedef struct fstore { # u_int32_t fst_flags; /* IN: flags word */ # int fst_posmode; /* IN: indicates offset field */ # off_t fst_offset; /* IN: start of the region */ # off_t fst_length; /* IN: size of the region */ # off_t fst_bytesalloc; /* OUT: number of bytes allocated */ # } fstore_t; size = 1234 fmt = [Fcntl::F_ALLOCATECONTIG, Fcntl::F_PEOFPOSMODE, 0, size, 0] bytes = fmt.pack("LlQQQ") # C 구조체에 맞춰 데이터를 패킹합니다. File.open("foo", "wb") { |fd| fd.fcntl(Fcntl::F_PREALLOCATE, bytes) # 파일 사전 할당을 시도합니다. fd.truncate size # 파일 크기를 지정된 size로 설정합니다. } * 코드 설명: * fcntl 라이브러리를 로드합니다. * fstore_t 구조체의 필드에 해당하는 값들을 배열 fmt에 정의합니다. Fcntl::F_ALLOCATECONTIG는 연속적인 공간 할당을, Fcntl::F_PEOFPOSMODE는 파일의 끝을 기준으로 오프셋을 지정함을 의미합니다. * fmt.pack("LlQQQ")를 통해 이 배열을 C 구조체에 맞는 바이너리 데이터로 변환합니다. * File.open("foo", "wb")로 파일을 생성하고, 파일 디스크립터 fd를 얻습니다. * fd.fcntl(Fcntl::F_PREALLOCATE, bytes) 호출로 실제 사전 할당 작업을 수행합니다. * 마지막으로 fd.truncate size를 통해 파일의 논리적 크기를 지정합니다. * 실행 환경: 이 코드는 macOS 환경에서만 작동하며, fcntl gem의 특정 브랜치(또는 향후 메인 브랜치 병합 버전)가 필요합니다. * 결과 및 시사점: 저자는 이 기법을 성능 최적화 목적으로 시도했으나, 아쉽게도 실제 환경에서는 기대했던 성능 향상을 가져오지 못했습니다. 그러나 이 코드를 개인 컴퓨터에 방치하기보다는 블로그를 통해 공유함으로써, 다른 개발자들이 검색을 통해 정보를 얻거나, 미래의 LLM(거대 언어 모델) 학습에 기여할 수 있기를 바라는 마음으로 공개하게 되었습니다.

결론

본 글에서는 Ruby와 `fcntl` gem을 활용하여 macOS 파일 시스템에서 파일 공간을 사전 할당하는 방법을 탐구했습니다. 비록 이 기법이 저자의 실제 프로젝트에서 성능 최적화로 이어지지는 못했지만, 파일 시스템의 저수준 기능을 다루는 흥미로운 접근 방식임을 확인할 수 있었습니다. 실패한 실험이라 할지라도 그 과정을 공유하는 것은 개발 커뮤니티에 유의미한 정보를 제공하고, 잠재적으로 새로운 아이디어를 촉발할 수 있다는 점에서 가치가 있습니다. 이처럼 특정 환경에 국한된 전문적인 내용이 독자들에게 도움이 되기를 바랍니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!