3


ΣΕΙΡΙΑΚΑ - ΧΡΟΝΟΛΟΓΙΚΑ ΑΡΧΕΙΑ

 

3.1. Περιγραφή και οργάνωση

Τα σειριακά αρχεία είναι ο απλούστερος τύπος οργάνωσης αρχείου. Όλες οι μέθοδοι που εφαρμόζονται σ’ αυτόν τον τύπο αρχείου εφαρμόζονται σχεδόν σε κάθε άλλο τύπο αρχείου. Παρά το γεγονός ότι οι μέθοδοι που εφαρμόζονται δεν είναι περίπλοκες και εξεζητημένες, είναι όμως αποτελεσματικές για τη λύση ενός προβλήματος.

Τα σειριακά αρχεία οργανώνονται τοποθετώντας εγγραφές στο τέλος του αρχείου σύμφωνα με τη σειρά αύξησής τους. Έτσι η πρώτη εγγραφή του αρχείου είναι η παλαιότερη εγγραφή και η τελευταία εγγραφή είναι αυτή που προστέθηκε πρόσφατα. Λόγω του περιορισμένου αριθμού πράξεων που είναι διαθέσιμες γι’ αυτόν τον τύπο αρχείου δεν υπάρχει τρόπος για να ταξινομηθούν οι εγγραφές.

Οι εγγραφές αυτού του τύπου μπορεί να είναι είτε σταθερού είτε μεταβλητού μήκους. Αυτό είναι ένα πλεονέκτημα των σειριακών αρχείων μια και οι μεταβλητού μήκους εγγραφές καθιστούν τη σχεδίαση αρχείου άλλου τύπου προβληματική. Έτσι, αν απαιτείται μεταβλητού μήκους εγγραφές αυτός ο τύπος αρχείου επιλέγεται.

Τα σειριακά αρχεία μπορούν να αποθηκευθούν και σε μαγνητικές ταινίες. Η μαγνητική ταινία δεν μπορεί να χρησιμοποιηθεί για αρχεία που οργανώνονται με περίπλοκους τρόπους.

 

3.2. Βασικές πράξεις (Primitive operations)

OPEN

CLOSE

READ-NEXT

EOF

VALID

WRITE-NEXT

APPEND

 

3.3. Αλγόριθμοι που υλοποιούν τις 6 καθιερωμένες διαδικασίες

  • Προσθήκη

Η προσθήκη εγγραφών σε σειριακό-χρονολογικό αρχείο είναι μια απλή διαδικασία, μια και οι νέες εγγραφές απλώς προστίθενται στο τέλος του αρχείου. Οταν πρόκειται για προσθήκη μιας εγγραφής, πραγματοποιείται μια φυσική εγγραφή στο δίσκο. Οταν όμως προστίθεται ένα σύνολο από εγγραφές το σύστημα αρχείου τα αποθηκεύει πρόσκαιρα στον buffer και τα γράφει στο δίσκο σε μέγεθος ενός block την φορά. Ετσι αν πρόκειται να προστεθούν Μ εγγραφές τότε απαιτούνται (περίπου) Μ/Β (Β= το μέγεθος του block) φυσικές εγγραφές στο δίσκο.

 

  • Διαγραφή

Δεν υπάρχει τρόπος (λογικός) που να διαγράφει μια εγγραφή από σειριακό αρχείο. Όταν το σειριακό αρχείο αποθηκεύεται στο δίσκο οι εγγραφές μπορούν να διαγραφούν μόνο λογικά “σημειώνοντάς” (flag) τις εγγραφές αυτές. Αυτό γίνεται δίνοντας κάποια συγκεκριμένη τιμή σε κάποιο από τα χαρακτηριστικά της εγγραφής. Π.χ. στον “κωδικό αριθμό υπαλλήλου” δίνουμε την τιμή -1. Συχνά χρησιμοποιείται και ένα άλλο πεδίο γι’ αυτόν τον σκοπό το οποίο λαμβάνει μια από τις 2 νόμιμες τιμές, που δηλώνουν ότι η εγγραφή είναι ενεργή ή είναι διαγραμμένη. Οποιαδήποτε μέθοδος κι αν χρησιμοποιηθεί για να σημειωθούν οι διαγραμμένες εγγραφές, η διαδικασία της εγγραφής αποτελεί ιδιαίτερη περίπτωση της διαδικασίας της ενημέρωσης. Που σημαίνει ότι πρέπει να διαβαστεί πρώτα η εγγραφή και μετά να διαγραφεί μέσω της ενημέρωσης της εγγραφής. Έτσι 2 λογικές μεταφορές απαιτούνται για την διαγραφή εγγραφής. Αν χρειάζεται να διαγραφούν πολλές εγγραφές ο blocking factor πιθανόν να μειώσει τις φυσικές μεταφορές, αν και βέβαια εξαρτάται και από τη σειρά που θα διαγραφούν οι εγγραφές.

Μια άλλη μέθοδος που χρησιμοποιείται για να προσδιοριστούν οι ενεργές εγγραφές είναι η χρήση ενός πίνακα bit map. Ο bit map είναι ένας πίνακας μιας διάστασης όπου κάθε bit παριστά μια εγγραφή του αρχείου. Το bit με την τιμή 0 δηλώνει ότι η αντίστοιχη εγγραφή δεν είναι ενεργή, ενώ η τιμή 1 δηλώνει ότι η αντίστοιχη εγγραφή είναι ενεργή.

Ο πίνακας bit map μπορεί να αποθηκευθεί στην αρχή του αρχείου καταλαμβάνοντας μια ή περισσότερες εγγραφές. Ή μπορεί να αποθηκευθεί σε ξεχωριστό αρχείο. Αν το αρχείο δεν είναι μεγάλο μπορεί να αντιγραφεί o bit map στη μνήμη όσο το αρχείο είναι ανοικτό.

Η διαγραφή εγγραφών με οποιοδήποτε απ’ τις 2 μεθόδους οδηγεί σε προβλήματα μια και η διαγραφή γίνεται με λογικό και όχι με φυσικό τρόπο. Έτσι κάποια στιγμή το αρχείο θα είναι κατακερματισμένο με εγγραφές που είναι λογικά διαγραμμένες δηλαδή μεγάλο μέρος του χώρου θα σπαταλιέται χωρίς λόγο. Για να αντιμετωπισθεί αυτό το πρόβλημα είναι αναγκαίο να αναδιοργανωθεί (reorganize) το αρχείο από καιρό σε καιρό. Αν και η αναδιοργάνωση αρχείου δεν θεωρείται ως μια από τις καθιερωμένες διαδικασίες παρ’ όλα αυτά είναι αναγκαία για τα σειριακά αρχεία και για κάποιους άλλους τύπους αρχείων που θα αναφέρουμε στη συνέχεια. Η συχνότητα εφαρμογής της αναδιοργάνωσης εξαρτάται από τον ρυθμό διαγραφής των εγγραφών, από περιορισμούς που έχουν σχέση με τον χώρο και την αποτελεσματικότητα στην επεξεργασία.

 

  • Αναδιοργάνωση

Επιτυγχάνεται αντιγράφοντας όλες τις μη σημειωμένες εγγραφές από το παλιό αρχείο σε νέο αρχείο και διαγράφεται το παλιό αρχείο.

Reogranization (Algorithm 1_1)

OPEN(oldfile); {set currency pointers to start of files}

OPEN(newfile);

WHILE not EOF(oldfile) DO BEGIN

READ_NEXT(oldfile, buffer);

IF VALID(oldfile) THEN APPEND(newfile, buffer);

{copy undeleted records to new file}

END;

 

  • Ανάγνωση όλων των εγγραφών του αρχείο χωρίς μια συγκεκριμένη σειρά

Είναι η λειτουργία που εφαρμόζεται άριστα στα σειριακά αρχεία. Το αρχείο απλώς διαβάζεται από την αρχή μέχρι το τέλος.

Read all records in any order (Algorithm 1_2)

OPEN(file); {set currency pointer to front of file}

WHILE not EOF(file) DO BEGIN

READ_NEXT(file, buffer);

IF VALID(file) THEN process buffer contents;

END;

 

  • Ανάγνωση μιας εγγραφής με βάση την τιμή κάποιου συγκεκριμένου κλειδιού

Είναι δυνατόν να συμβούν μια από τις παρακάτω 3 περιπτώσεις:

  1. Υπάρχει ακριβώς μια εγγραφή που να ταιριάζει με την τιμή του κλειδιού.

  2. Υπάρχουν περισσότερες από μια εγγραφές που ταιριάζουν με την τιμή του κλειδιού.

  3. Δεν υπάρχει εγγραφή που να ταιριάζει με την τιμή του κλειδιού.

Όλες οι παραπάνω περιπτώσεις αντιμετωπίζονται με την ίδια μέθοδο τόσο για αρχείο αποθηκευμένο σε δίσκο όσο και σε ταινία. Η αναζήτηση είναι ταχύτερη σε δίσκο παρά σε ταινία. Το αρχείο διαβάζεται σειριακά μέχρι να εντοπισθεί η αναζητούμενη εγγραφή. Η αναζητούμενη εγγραφή μπορεί να είναι η 1η ή η τελευταία ή οποιαδήποτε άλλη. Κατά μέσο όρο χρειάζεται να αναγνώσουν τις μισές εγγραφές.

Στον αλγόριθμο που ακολουθεί η συνάρτηση key(buffer) χρησιμοποιείται για να προσπελασθεί η τιμή του κλειδιού της εγγραφής που έχει αναγνωσθεί από το αρχείο και βρίσκεται αποθηκευμένη στον buffer. Ο αλγόριθμος γι’ αυτή την αναζήτηση είναι ο παρακάτω.

Read a record with specific key value (Algorithm 1_3)

logical function Algor1_3(givenkey, file, buffer);

{returns true iff record in buffer matches the given key}

OPEN(file); {set currency pointer to front of file}

Algor1_3 := false; {in case record is never found}

WHILE not EOF(file) and not Algor1_3 DO BEGIN

READ_NEXT(file, buffer);

IF VALID(file) AND key(buffer) = givenkey

THEN Algor1_3 := true;

END;

Στην περίπτωση που υπάρχουν πολλές εγγραφές με την ίδια τιμή κλειδιού τότε πρέπει να αναγνωσθούν όλες οι εγγραφές. Ο αλγόριθμος γι’ αυτή την περίπτωση είναι παρόμοιος με μια μικρή τροποποίηση.

logical function Algor1_4(givenkey, file);

{returns true iff one or more matching records found}

OPEN(file); {set currency pointer to front of the file}

ALGOR1_4 := false; {in case no matching found}

WHILE not EOF(file) DO BEGIN

READ_NEXT(file, buffer);

IF VALID(file) and Key(buffer) = givenkey THEN BEGIN

ALGOR1_4 := true;

process the buffer contents;

END;

END;

Και στην περίπτωση που δεν υπάρχουν περισσότερες από μια εγγραφές με την ίδια τιμή κλειδιού θα δοθεί το σωστό αποτέλεσμα. Και οι 2 αλγόριθμοι θα δώσουν το ίδιο αποτέλεσμα αν δεν βρεθεί εγγραφή/φες που να ταιριάζει με την τιμή του κλειδιού.

 

  • Ανάγνωση όλων των εγγραφών με βάση κάποιο συγκεκριμένο κλειδί

Η διαδικασία αυτή είναι ακατάλληλη για σειριακό αρχείο. Ο μόνος λόγος που την συμπεριλαμβάνουμε είναι για να δείξουμε πόσο πραγματικά κακή είναι.

Read all records in key order (Algorithm 1_5)

Key(buffer0) := min; {min is the lowest value the can have}

done := false;

DO BEGIN {one record processed per iteration}

key(buffer2) := max; {max is the highest value the key can have}

OPEN(file); {position currency pointer at beginning of file}

WHILE not EOF(file) DO BEGIN {one record examined per iteration}

READ_NEXT(file, buffer1);

IF VALID(file) and key(buffer2) ³ key(buffer1) ³ key(buffer0) THEN buffer2 := buffer1;

END; {buffer2 now has the record with smallest key value larger than that found in buffer0}

IF key(buffer2) = key(buffer0) THEN BEGIN

{call procedure to process buffer2}

buffer0 := buffer2; {save new minimum key value}

END

ELSE done := true;

CLOSE(file);

END UNTIL done;

 

Περίληψη

Τα σειριακά-χρονολογικά αρχεία σχηματίζονται με την προσθήκη εγγραφών μόνο στο τέλος του αρχείου και σύμφωνα με τη σειρά άφιξης τους. Λόγω της απλής οργάνωσης τους μπορούν να χρησιμοποιηθούν με μια ποικιλία μαγνητικών μέσων συμπεριλαμβανομένων και της μαγνητικής ταινίας. Η δομή της εγγραφής μπορεί να είναι μεταβλητού μήκους πράγμα που δεν υποστηρίζουν όλες οι δομές αρχείων. Αν και οι εγγραφές δεν διαγράφονται φυσικά από το αρχείο παρ’ όλα αυτά είναι δυνατή η λογική τους διαγραφή, με το να σημειώσουμε (flagging) τις εγγραφές αυτές ή με τη χρήση bit map πίνακα όπου δηλώνονται οι ενεργές εγγραφές. Επειδή όμως οι διαγραμμένες εγγραφές συνεχίζουν να αποτελούν μέρος του αρχείου, είναι αναγκαίο να εφαρμόζεται περιοδική αναδιοργάνωση του αρχείου, ώστε να διαγράφονται και φυσικά.

Αυτός ο τύπος αρχείου είναι σημαντικός μια και όλοι οι άλλοι τύποι αρχείων μπορούν να θεωρηθούν και ως σειριακά-χρονολογικά αρχεία. Ετσι οι αλγόριθμοι που παρουσιάστηκαν σ’ αυτό το κεφάλαιο μπορούν να εφαρμοστούν και στους περισσότερους τύπους αρχείων.

 


Up ] 1 ] 2 ] [ 3 ] 4 ] 5 ] 6 ] 7 ] 8 ] 9 ] 10 ]

Copyright Πανεπιστήμιο Μακεδονίας
Για σχόλια [Μ. Σατρατζέμη]
Τελευταία ενημέρωση : Δεκέμβριος 20, 2002