파일의 논리적 기본 단위는 레코드입니다. 이 레코드는 또 데이터값을 포함하는 여러 필드들로 구성됩니다.
각 필드의 구분은 다음 4가지 방법으로 구분합니다.
- 각 필드의 길이 고정 (Fixed Length Field)
- 각 필드에 바이트 크기 포함 (Length Indicator)
- 구분자(Delimeter)로 필드 사이를 분리
- Key-Value 형태로 표현
첫번째 Fixed Length Field의 경우 내부 단편화로 인한 공간 낭비가 생긴다는 단점이 있지만, 데이터 처리가 단순다는 장점이 있습니다. 이 방법은 모든 필드의 길이가 미리 결정되어있고 불변한 상황에서 적합합니다.
두번째인 Length Indicator는 필드 처음에 길이를 포함하는 필드를 저장하는 방식인데, 이때문에 길이 필드를 위한 추가 공간을 요구하는 단점이 있습니다.
세번째인 Delimeter로 필드를 분리하는 방법은 필드의 값을 나타나지 않을 특수 문자로 사용하여 구분자로 쓰는 방법입니다. 두번째와 세번째는 가변길이의 필드가 가능하므로 가변적인 길이가 나오는 상황에서 적합합니다.
네번째인 Key - Value 형태로 표현하는 방법은 필드 이름과 값으로 필드를 표현합니다. 자료구조의 해쉬와 유사한 구조라고 볼 수 있고, 특정 필드의 생략이 가능합니다. 다만, 이는 필드를 표현하는 방식이지 구분 방식이라고 보기는 힘듭니다.
레코드 구조는 다음 5가지로 구분됩니다.
- 고정길이 레코드 (Fixed - Length Record)
- 필드 수 고정
- 길이 정보
- 필드에 대한 주소 저장 (Index File Use)
- 각 레코드 끝에 구분자 저장
첫번째인 고정길이 레코드는 레코드의 길이가 미리 결정된 경우에 쓰며, 가변 개수의 가변길이 필드를 저장하기 위한 틀로 사용되고 가변길이의 필드들이 고정길이 레코드에 저장가능합니다.
두번째인 필드 수 고정 방법은 레코드가 미리 정의된 개수의 필드들로 구성되는 방법입니다.
세번째인 길이정보는 레코드의 첫번째 필드에 레코드의 길이값을 저장하는 방법입니다.
네번째 필드에 대한 주소 저장은 별도 파일(인덱스 파일)에 각 레코드에 대한 주소값을 저장합니다.
마지막은 적어둔 대로 레코드 구분자를 레코드 끝에 저장합니다.
주로 1~3번째를 사용합니다.
레코드의 길이를 표현하는데는 주로 2 byte의 이진수를 사용합니다. 그 이유로는 이진수는 0 ~ 65,535 사이의 길이가 표현이 가능한데 비해 2 byte의 아스키값은 0 ~ 99 사이의 길이 표현만 가능하기에 저장길이가 더 긴 이진수를 사용합니다.
각 레코드에서 필드를 하나씩 추출하는 과정을 Unpack, 필드값들을 하나씩 버퍼 객체로 채우는 과정을 Pack 이라고 합니다.
구분자로 레코드를 구분하는 경우 이를 위해 DelimeterTextBuffer가 사용되고, 가변길이로 구분하는 경우 LengthTextBuffer가, 고정길이로 구분하는 경우 FixedTextBuffer가 사용됩니다.
연산을 위해서 나뉜 버퍼들은 BufferClassHierachy로 나타낼 수 있는데, 가장 최상위인 버퍼레벨의 I/O Buffer는 버퍼를 위한 문자 배열이 저장되고 그 하위인 레코드 레벨에는 가변길이 레코드의 Read/Write를 위한 VariableLengthBuffer와 고정길이 레코드의 Read/Write를 위한 FixedLengthBuffer가 존재합니다. 이 하위인 필드 레벨에는 구분자 필드의 Pack/Unpack을 위한 DelimeterFieldBuffer와 길이기반 필드의 Pack/Unpack을 위한 LengthFieldBuffer, 고정길이 필드의 Pack/Unpack을 위한 FixedFieldBuffer가 존재합니다. 이중 DelimeterFieldBuffer와 LengthFieldBuffer는 가변길이로 사용되므로 VariableLengthBuffer의 하위에 존재하고, FixedFielldBuffer는 FixedLengthBuffer 하위에 존재합니다.
'Computer Science > 파일처리' 카테고리의 다른 글
키 정렬과 인덱싱 (0) | 2024.03.11 |
---|---|
레코드의 관리 (0) | 2024.03.11 |
UNIX Kernel (0) | 2024.03.08 |
Write (0) | 2024.03.07 |
테이프와 CD-ROM (0) | 2024.03.07 |