4. 순차 화일
순차 화일(sequential file) 정의 레코드들을 조직하는 가장 기본적인 방법 화일 생성시 레코드들을 연속적으로 저장하기 때문에 레코드들을 접근할 때도 저장 순서에 따라 연속적으로 접근하는 것이 효율적 스트림 화일(stream file) 레코드 저장 기준에 의한 종류 입력 순차 화일(entry-sequenced file) 레코드가 입력되는 순서대로 저장, heap file, pile file 키 순차 화일(key-sequenced file) 레코드의 특정 필드 값 순서에 따라 저장
스트림 화일(stream file) 특성 종류 화일 접근 모드(access mode) 데이타가 하나의 연속된 바이트 스트림(byte stream)으로 구성 연속적인 판독 연산을 통해 레코드가 화일에 저장되어 있는 순서에 따라 데이타를 접근 종류 순차 접근 스트림 화일(sequential access stream file) 순차 접근만 허용 임의 접근 스트림 화일(random access stream file) 임의 접근이 허용 화일 접근 모드(access mode) 화일 개방 시 수행하려는 연산을 명세: 판독(read), 기록(write), 갱신(read/write), 첨가(append) 등
▶ 순차 접근 스트림 화일 판독(read) 기록(write) 판독 연산 해당 위치에서 시작하여 해당 바이트를 전송하고, 판독 포인터를 스트림 화일의 다음 바이트의 시작 위치로 변경. n번째 바이트를 판독하기 위해서는 반드시 (n-1)번째 바이트를 판독해야 함. 기록(write) 화일을 기록(write) 모드로 열면 기록 포인터는 화일의 첫 번째 바이트가 기록될 위치를 가리킴. 기록 연산 해당 위치에서 시작하여 해당 바이트 값을 기록하고, 기록 포인터를 다음 바이트가 기록될 위치로 변경. n번째 바이트를 기록하기 위해서는 반드시 (n-1)번 기록 연산을 수행해야 함.
▶ 순차 접근 스트림 화일 C 언어를 이용해 streamfile이라는 스트림 화일을 생성 함수 호출문 fopen(filename, mode)은 화일을 개방하거나 화일이 없으면 생성해서 화일 포인터(file pointer)를 반환 화일이 개방되면 화일 포인터가 화일 이름 대신 사용됨 streamfp = fopen(“streamfile”, “w”); 화일이 공백인 경우에는 공백 스트림 화일을 생성하고 개방 streamfp는 화일 포인터 mode에는 “r”(read), “w”(write), “a”(append) 등 화살표는 판독/기록 위치를 표현하는 인덱스 ? index : 0 1 2 3 4 5 6 streamfile
▶ 순차 접근 스트림 화일 함수 호출문 fputc()로 스트림 화일에 한 문자씩 기록 fputc(ch,streamfp)를 연속적으로 사용하여 문자 S, M, I, T, H 값을 입력하면 다음과 같은 streamfile이 생성. ch는 문자에 대한 정수 값 streamfp는 streamfile에 대한 화일 포인터 M I T H ? S index : 0 1 2 3 4 5 6 streamfile
▶ 순차 접근 스트림 화일 함수 호출문 fclose(filepointer)로 화일을 폐쇄 fclose(streamfp); 화일 포인터 streamfp가 지시하는 화일 streamfile을 폐쇄. end-of-file(♦) 표시가 화일 끝에 첨가 연속적으로 화일을 접근하고, 화일에 있는 모든 바이트를 처리하는 경우에 유용 M I T H ◆ S index : 0 1 2 3 4 5 streamfile
▶ 임의 접근 스트림 화일 화일의 시작, 끝, 현재의 판독/기록 위치로부터 오프셋(offset) 값을 이용하여 이전의 바이트를 접근하지 않고 직접 접근 판독/기록 위치 인덱스를 이동 임의 접근을 위한 함수 fseek(filepointer, offset, WhereFrom) 화일 스트림에서 판독/기록 위치 인덱스를 변경하는 데 사용 ftell(filepointer) 화일에서 현재의 판독/기록 위치 인덱스 값을 알기 위해 사용
▶ 임의 접근 스트림 화일 “r”(판독) 모드로 개방한 스트림 화일 streamfp = fopen(“streamfile”, “r”); 화일이 개방되면 판독 위치 인덱스는 첫 번째 바이트를 가리키게 설정 ftell(streamfp) 현재의 판독/기록 인덱스 값을 반환 현재 streamfile의 판독 /기록 인덱스 값이 0이므로, 0이 반환됨. M I T H ◆ S index : 0 1 2 3 4 5 streamfile
▶ 임의 접근 스트림 화일 fseek(streamfp, 2, SEEK_SET); ftell(streamfp) M I T H ◆ 시작 위치(SEEK_SET)로부터 판독 인덱스를 2바이트(offset)만큼 이동시킴. SEEK_SET:시작 위치 SEEK_END:끝 위치 SEEK_CUR:현재 위치 ftell(streamfp) 현재 판독 인덱스 값이 2이므로, 2가 반환됨. M I T H ◆ S index : 0 1 2 3 4 5 streamfile
입력 순차 화일(entry-sequenced file) 히프 화일(heap file), 파일 화일(pile file)이라고도 함 데이타가 입력되는 순서대로 저장된 화일 레코드에 대한 분석, 분류, 표준화 과정을 거치지 않음 필드의 순서, 길이 등에 제한 없음 레코드의 길이, 타입이 일정하지 않음 레코드는 <필드, 값> 쌍들로 구성 5 개의 레코드 예
입력 순차 화일 삽입 작업 검색 작업 삽입되는 레코드는 화일의 끝에 첨가 주어진 탐색 매개변수(search parameter)의 값과 이에 대응하는 화일 레코드 필드 값을 화일 시작부터 비교하여 레코드를 선정하고, 선정된 레코드에서 원하는 필드 값을 검색 키 필드(key field) : 레코드 선정 시 탐색 매개변수와 대응되는 데이타 필드 탐색 키 필드(search key field) : 탐색 매개변수의 필드
입력 순차 화일 삭제, 변경 작업 입력 순차 화일 응용 예 새로운 순차 화일을 동시에 생성하면서 수행 삭제작업 변경 작업 삭제 대상 레코드를 탐색하면서 기존의 레코드를 새로운 화일로 출력 해당 레코드 선정 시 나머지 레코드들을 그대로 새로운 화일로 출력 변경 작업 해당 레코드 선정 시 레코드의 값을 변경하고 새로운 화일에 출력 나머지 레코드들은 그대로 새로운 화일에 출력 입력 순차 화일 응용 예 데이타를 처리하기 전에 임시로 수집만 해 놓는 경우 화일 조직을 결정하지 못한 경우 화일의 용도가 결정되지 않은 경우 데이타 은행(data bank) 화일 조직의 변경 과정에서 중간 단계의 화일 형태로 이용
키 순차 화일(key-sequenced file) 저장 장치에서의 레코드 순서와 레코드 리스트의 논리적 순서가 같은 구조의 화일 화일 내에서의 레코드는 키 필드 값에 따라 정렬 모든 레코드는 똑같은 순서의 데이타 필드로 구성 데이타 필드는 화일 설명자에 한 번만 저장하면 됨 학번 1243 1257 1332 1334 1367 1440 이름 홍길동 김철수 박영희 이기수 정미영 최미숙 나이 10 20 19 21 본적 서울 경기 충청 전라 경상 강원 성 남 여
키 순차 화일 정렬된 화일(sorted file) : 키 순차 화일처럼 레코드들이 특정 키 필드 값에 따라 정렬된 화일 정렬 키(sort key) : 정렬에 사용된 값의 필드 오름차순(ascending) / 내림차순(descending) 정렬 오름차순 정렬 if (레코드 i의 키 값 ≤ 레코드 j의 키 값) then 레코드 i는 레코드 j 앞에 위치;
키 순차 화일 순차 화일의 정렬 순서 순차 화일의 특징 응용에 따라 결정 전화번호부: 가입자 이름 순 또는 상호 순 하나의 순차 화일은 두 개의 상이한 정렬 순서를 만족시킬 수 없음. 여러 가지 상이한 정렬 순서의 화일이 필요한 경우에는 임시 화일을 만들어 사용했다가 용도가 끝나면 화일을 삭제 순차 화일의 특징 대화식(interactive) 처리 보다는 일괄(batch) 처리에 유리 장점 : 데이타의 순차 접근에서는 차위 레코드의 접근이 신속 데이타의 접근 형태를 고려한 뒤 그 접근 방법에 맞는 화일 구조를 선정
순차 화일의 설계 설계 시 고려 사항 1. 레코드 내의 필드 배치는 어떻게 할 것인가? 데이타의 필드 활용도에 따라 활동 화일(active file)과 비활동 화일(inactive file)로 분리하여 저장 활동 화일의 크기를 감소시켜 데이타 화일에 대한 처리 시간 감소 활동과 비활동을 필드 타입이 아닌 레코드 어커런스 활용에 따라 구분 가능 고정 길이(fixed length)와 가변 길이(variable length) 고정 길이 레코드: 사용하지 않는 공간 낭비 가변 길이 레코드: 각 레코드 길이를 적절한 제어 정보와 함께 저장 레코드 제어 정보는 각 레코드 앞 부분에 있는 시스템용 필드에 저장됨
순차 화일의 설계 C 프로그램 예 typedef struct course_type /* 과목 데이타 타입 선언 */ { char dept[4]; char course_name[20]; char prof_ID[7]; int credit; }; typedef struct STUDENT /* 학생 레코드 구조 선언 */ { int st_num; struct name_type { char last[20]; char midinit; char first[20]; } name; struct address_type { char street[25]; char city[10]; char state[2]; int zip; } address; int no_of_courses; course_type course[10]; /* 한 학생이 최대 10강좌 수강 가능 */ }
순차 화일의 설계 2. 키 필드는 어느 것으로 할 것인가? 3. 적정 블로킹 인수는 얼마이어야 하는가? 응용 요건에 따라 선정 키 값은 순차 화일에서 레코드 접근 순서를 결정 트랜잭션 화일은 마스터 화일과 같은 키 보고서 화일은 출력 형식(순서)에 따라 레코드가 정렬될 수 있게 결정 3. 적정 블로킹 인수는 얼마이어야 하는가? 일반적으로 가능한 한 블록을 크게 하는 것이 바람직함 버퍼의 크기와 운영 체제가 지원하는 페이지 크기에 의해 제한 순차 화일의 디스크 저장 섹터 주소 기법 사용 시 블록 크기를 섹터 크기와 같게 실린더 주소 기법 사용 시 블록 크기를 트랙 크기와 같게
순차 화일의 생성 화일 생성 편집 데이타 저장 장치에 레코드들을 순서대로 입력하여 생성 키 순차 화일의 갱신(삽입, 삭제, 변경) 연산은 트랜잭션 화일(transaction file)을 이용 트랜잭션 화일은 데이타 수집, 레코드 형식으로 변환, 레코드 편집, 정렬 과정을 거쳐 생성 편집 트랜잭션 화일 생성 과정에서 입력되는 데이타 값에 오류가 있는지 검사하는 과정 검사 내용 입력된 값이 올바른 범위 안에 있는가 필수적인 필드 값 존재 여부, 필드 타입 적절성, 필드 값 유효성, 관련 필드 값 유무 합계의 일치, 계수 숫자 타입 필드의 앞자리 공백은 0으로 채움, 영숫자나 텍스트를 적절한 단축 코드로 채움, 누락된 데이타 값 삽입
순차 화일의 생성 편집과 정렬 작업 특정 응용 프로그램이나 범용 유틸리티 프로그램을 이용하여 수행 1. 한 저장 장치에서 다른 저장 장치로 순차 화일을 복사 2. 같은 저장 장치에서 하나의 순차 화일을 또 다른 순차 화일로 복사 3. 레코드에 대한 간단한 편집 수행 4. 레코드에 대해 간단한 재구성 수행 5. 주어진 필드 값에 따라 오름차순/내림차순으로 화일을 정렬 6. 여러 개의 정렬된 화일을 오름차순/내림차순으로 하나의 정렬된 화일로 합병
순차 화일의 갱신 순차 화일에서의 검색 순차 화일에 대한 질의 레코드의 저장 순서에 따라 연속적으로 검색 레코드 검색 순서에 따라 레코드 입력 순서를 결정 순차 화일에 대한 질의 화일 구조상 연속적이고 레코드 전체에 대한 접근이 필요한 검색의 경우에 효율적 사원 봉급의 평균과 표준 편차는 얼마인가? 네 개의 의료 보험에 각각 몇 명의 사원들이 가입되어 있는가? 화일의 질의 적중 비율(inquiry hit ratio) 질의 적중 비율이 높으면 입력 순차 화일 구조가 적합 = 질의 응답을 위해 접근해야 되는 레코드 수 화일 전체의 레코드 수
▶ 키 순차 화일의 갱신 키 순차 화일에 대한 레코드 삽입 키 순차 화일에서의 레코드 삭제 키 순차 화일에서의 레코드 수정 키 값에 따라 오름차순/내림차순을 유지해야 하므로 복잡 두 기존 레코드 사이에 삽입 위치를 검색 이 삽입 점 앞에 있는 모든 레코드들은 새로운 화일로 복사 새로운 레코드를 삽입 삽입 점 뒤에 있는 나머지 레코드들을 새로운 화일로 복사 키 순차 화일에서의 레코드 삭제 삽입과 거의 같은 단계를 거친다. 삭제할 레코드를 제외하고 나머지 레코드만 새로운 화일로 복사 키 순차 화일에서의 레코드 수정 수정할 레코드 앞의 모든 레코드를 새로운 화일로 복사 원하는 레코드를 수정해서 새로운 화일에 삽입 나머지 레코드들을 새로운 화일로 복사 직접 접근 저장 장치에 저장된 화일 순차 화일의 임의 접근이 가능하므로, 레코드를 수정해서 기존 레코드 위치에 수정된 레코드를 기록
▶ 순차 마스터 화일의 갱신 갱신 트랜잭션을 트랜잭션 화일에 모아서 일괄 처리 트랜잭션 화일의 트랜잭션 레코드 레코드 갱신 마스터 화일과 똑같은 키로 정렬 갱신 프로그램에 의해 마스터 화일에 적용 트랜잭션 레코드는 대응하는 마스터 레코드의 키 값과 갱신 타입을 나타내는 갱신코드(update code)를 포함 레코드 갱신 새 레코드의 삽입(I) 기존 레코드의 삭제(D) 기존 레코드의 수정(C) 갱신을 위한 트랜잭션 레코드
▶ 순차 마스터 화일의 갱신 트랜잭션의 삽입 트랜잭션의 삭제 트랜잭션의 수정 화일 갱신(삽입, 삭제, 수정)시 고려 사항 레코드 키 값은 필수 기타 데이타 필드 값은 선택적(나중에 삽입 가능) 트랜잭션의 삭제 보통 해당 마스터 레코드의 키 값만을 명세 트랜잭션의 수정 레코드 키 값과 수정될 필드들과 해당 값만 명세 일반적으로 수정하지 않을 필드는 공백으로 남겨 놓는다. 화일 갱신(삽입, 삭제, 수정)시 고려 사항 이미 저장되어 있는 레코드의 삽입(키 값의 중복), 화일에 없는 레코드 삭제나 수정 등의 오류 갱신 프로그램은 오류 보고서를 생성하여 수행하지 못한 모든 트랜잭션의 내용과 이유를 출력
일련의 트랜잭션에 의해 영향을 받는 화일의 레코드 수 ▶ 마스터 화일의 갱신 빈도 화일의 갱신 빈도를 결정하는 요인 데이타 내용의 변경율 마스터 화일의 크기 마스터 화일에 대한 최신 데이타 요구 화일 활동 비율 화일 활동 비율(file activity ratio) = 일련의 트랜잭션에 의해 영향을 받는 화일의 레코드 수 화일의 총 레코드 수
▶ 순차 화일의 갱신 작업 마스터 화일 / 신마스터 화일 화일 활동 비율이 낮을수록 신마스터 화일로 단순히 복사하는 레코드 수가 증가 갱신 작업 종료 시 실행 과정에서 일어난 여러 가지 오류와 갱신 요약을 보고서로 생성
▶ 키 순차 마스터 화일의 갱신 알고리즘 가정 갱신 알고리즘 트랜잭션 화일과 순차 마스터 화일은 똑같은 키로 오름차순으로 정렬 각 화일의 레코드 키 값은 유일 갱신 알고리즘 트랜잭션 화일 레코드를 마스터 화일 레코드와 비교 레코드 키 값이 두 화일에서 일치하면 갱신 코드에 따라 레코드를 수정 또는 삭제 트랜잭션 레코드 키 값이 마스터 화일의 어떤 레코드의 것과도 일치하지 않으면, 새로 삽입할 레코드로 판정하고 마스터 화일에 삽입
▶ 키 순차 마스터 화일의 갱신 알고리즘 오류 처리 transKey와 masterKey의 비교 마스터 화일에 있는 레코드 키 값을 가진 레코드를 삽입 마스터 화일에 없는 레코드 키 값을 가진 레코드를 삭제 마스터 화일에 없는 레코드 키 값을 가진 레코드를 수정 transKey와 masterKey의 비교 갱신 알고리즘의 핵심은 transKey와 masterKey의 비교작업 transKey : 트랜잭션 화일의 레코드 키 masterKey : 마스터 화일의 레코드 키 가정 : 화일의 끝을 표시하는 EOF는 어떤 레코드 키 값보다 크다.
▶ 키 순차 마스터 화일의 갱신 알고리즘 masterKey < transKey masterKey = transKey 마스터 레코드에 적용할 트랜잭션 레코드가 없는 경우 마스터 레코드를 새로운 마스터 화일로 복사만 하고, 다음 마스터 레코드를 읽어 온다. masterKey = transKey 트랜잭션 레코드의 갱신코드에 따라 적절한 연산을 수행 수정(C)인 경우 : 레코드를 변경해서 새로운 마스터 화일에 삽입하고, 다음 트랜잭션 레코드를 읽어 온다. 삭제(D)인 경우 : 마스터 레코드는 삭제, 즉 무시된다. 삽입(I)인 경우 : 마스터 화일에 이미 같은 키 값을 가진 레코드가 있으므로 중복 레코드라는 오류 메시지를 출력하고 다음 트랜잭션 레코드를 읽어 온다.
▶ 키 순차 마스터 화일의 갱신 알고리즘 하나의 마스터 레코드에 적용할 트랜잭션이 다수인 경우 3. masterKey > transKey 트랜잭션 레코드 키와 일치하는 마스터 레코드가 없는 경우 갱신 코드가 삽입(I)인 경우: 레코드를 구성해서 새로운 마스터 화일에 삽입하고 다음 트랜잭션 레코드를 처리 그 이외 갱신 코드가 수정(C)이거나 삭제(D)인 경우: 적절한 오류 메시지를 출력하고, 다음 트랜잭션 레코드를 처리 하나의 마스터 레코드에 적용할 트랜잭션이 다수인 경우 트랜잭션 레코드들을 발생 시간 순서에 따라 적용 트랜잭션 레코드들을 1차 키 transKey, 2차 키 트랜잭션 발생 시간으로 정렬한 뒤에 갱신 작업을 시작 갱신된 레코드를 새로운 마스터 화일에 출력하기 전에 관련 트랜잭션들이 모두 처리되었는지 확인
순차 화일과 임의 접근 순차 화일의 저장 임의 갱신(random update) 순차 접근 저장장치(테이프) 임의 접근 저장장치(디스크)에도 저장 가능 실린더 단위로 저장하면 탐구 시간을 절약 임의 갱신(random update) 갱신 과정 해당 마스터 레코드를 판독 마스터 레코드에 트랜잭션 적용 갱신된 마스터 레코드를 원래의 위치에 재기록 효율적 : 해당 레코드만 읽고, 원 위치에 재기록 레코드 삭제 : 물리적인 제거보다 해당 레코드 위에 “deleted” 플래그를 표시하여 논리적 삭제로 대신하는 것이 효율적