본문 바로가기

Library/File Structure

File Organization 1

어떤 레코드의 집합을 파일에 저장하는 방법은 여러가지 전략이 존재할 수 있다. 크게 나눈다면 고정폭 길이와 가변폭 길이의 레코드를 저장하는 방법으로 나눌 수 있을 것이다. 그리고, 각각의 전략은 자신만의 트레이드 오프를 가진다.

레코드를 저장하는 가장 단순한 방법은 데이터를 스트림의 형태로 만들어 직렬화하는 것이다. 그러나, 이것은 데이터를 각각의 필드로 구분하는데 추가적인 작업이 필요하다. 직렬화된 데이터 입출력을 하는게 아니라면 이 방식은 적절한 방법이 아니다.

만약, 고정폭 길이의 레코드 저장 방식을 선택한다면, 레코드의 특정 위치로 접근하는데 걸리는 시간을 상수 시간으로 줄일 수 있다. 각 레코드 길이는 일정하기 때문에, 특정 레코드의 위치는 간단히 오프셋을 계산함으로써 특정 레코드로 직접적으로 접근할 수 있다. 그러나, 고정폭 길이의 레코드는 각 필드의 길이가 제한된다는 단점이 존재한다.

가변폭 길이의 레코드 저장 방식은 각 필드의 길이를 임의로 확장할 수 있으며, 이것은 특정 정보를 저장하는데 유리하다. 특히, 필드의 데이터 길이가 얼마가 될지 예측할 수 없는 상황에서 매우 유용하다. 그렇지만, 이 방식은 레코드 탐색에서 순차 탐색만 가능하다는 문제를 가지고 있다. 즉, 고정폭 길이 레코드처럼 오프셋을 간단히 계산하여 원하는 레코드의 위치를 알아낼 수 없으며, 처음부터 레코드를 읽어나가며 레코드 사이의 경계를 파악해야 한다.

그리고, 고정폭 방식과 가변폭 방식을 적절히 혼용하는 방법도 있을 수 있다. 즉, 고정폭 길이의 레코드 저장 방식을 선택한다고 하더라도, 그 안의 필드 구별 방식에서는 가변폭 필드를 선택할 수 있다. 예를 들어, 구분자(delimiter) 따위를 지정하여, 필드 사이의 경계를 구분할 수 있다. 물론, 이 방법은 레코드 저장 공간 자체를 구분자로 소모한다는 단점이 있고, 특수 문자가 많이 사용되어야 하는 데이터에서는 유리하지 못한 선택이 될 수도 있다. 하지만, 고정폭 길이의 레코드에서 가변폭 필드를 구현하기 위한 대표적인 전략 중 하나다.

구분자를 사용하는 방법 외에도, 필드의 시작에 필드의 해당 필드의 길이를 명시하는 방법을 선택할 수도 있다. 또, 가변 길이 필드, 가변 길이 레코드를 지원하기 위해 레코드의 시작에 한 레코드의 길이를 기록하거나, 필드를 구별하기 위해 구분자를 넣는 방법도 고려해 볼 수 있다. 이것 외에도 레코드와 필드 모두를 구별하기 위한 각각의 구분자를 넣는 방법도 있을 것이다.