-
Notifications
You must be signed in to change notification settings - Fork 0
erikk03/Implementation-of-Database-Systems-Project2
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
ΕΡΓΑΣΙΑ_2: ΥΛΟΠΟΙΗΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ 2023-2024 ΜΕΛΗ ΟΜΑΔΑΣ: ΚΑΓΙΑΤΣΚΑ ΕΡΙΚ-1115202100043 ΚΑΛΑΜΠΟΚΗΣ ΕΥΑΓΓΕΛΟΣ-1115202100045 ΚΟΝΤΟΣ ΙΑΣΩΝ-1115202100064 ΣΤΟ ΑΡΧΕΙΟ "hash_file.h": -Global_array: Δομή που περιέχει τον αριθμό των ενεργών αρχείων και έναν πίνακα με δείκτες σε δομή HT_info σε κάθε θέση του. Μια δομή HT_info αντιστοιχεί σε ενα αρχείο. -HT_info: Δομή που αποθηκεύεται στο πρώτο μπλοκ του αρχείου και περιέχει το hash_table και το αναγνωριστικό του αρχείου. -HashTable: Δομή που αποθηκεύεται στο πρώτο μπλοκ και περιέχει το global_depth και έναν πίνακα με δείκτες σε Directory, ο οποίος δεσμεύεται δυναμικά. -Directory: Δομή που περιέχει το id της κάθε θέσης και έναν δείκτη στο block στο οποίο αποθηκεύονται οι εγγραφές. ΣΤΟ ΑΡΧΕΙΟ " hash_file.h": -HT_Init: Αρχικοποιεί το global_array κατάλληλα. -HT_CreateIndex: Αρχικοποιεί το αρχείο και το ht_info , δεσμεύει χώρο για το hash_table και τα directories. Επίσης αρχικοποιείται ο πίνακας pos_array που χρησιμοποιείται για την αποθήκευση της θέσης του block στην μνήμη στο οποίο δείχνει κάθε directory, για τη σωστή χρήση της BF_GetBlock. -HT_OpenIndex: Ανοίγει το αρχείο και ρυθμίζει κατάλληλα το global_array ώστε να περίεχει στη σωστή θέση το header_block που παρέχει πρόσβαση στις δομές του αρχείου. -HT_CloseFile: Κλείνει το αρχείο και αποδεσμεύει τη μνήμη που δεσμεύτηκε δυναμικά κάτα την εκτέλεση του προγράμματος. -HT_InsertEntry: Τοποθετεί εγγραφές στα κατάλληλα μπλοκ και όταν χρειαστεί καλεί 2 βοηθητικές συναρτήσεις. Αυτές είναι οι double_ht και bucket_split υπεύθυνες για τον διπλασιασμό του πίνακα και το "σπάσιμο" των μπλοκ στο οποίο δε χωράει η εκάστοτε εγγραφή. ΣΤΟ ΑΡΧΕΙΟ "extra.c": Περιέχονται όλες οι βοηθητικές συναρτήσεις που χρησιμοποιούνται. Υπάρχει αναλυτική περιγραφή για την καθεμία στο αρχείο "extra.h", όπου γίνεται και η δήλωσή τους. ΣΧΕΔΙΑΣΤΙΚΕΣ ΕΠΙΛΟΓΕΣ: Όταν ένα μπλοκ πρέπει να "σπάσει" δημιουργόυμε 2 νέα μπλοκ, το new_block και το new_block2. Οι εγγραφές γίνονται rehashed στα 2 νέα αυτά μπλοκ και το προηγούμενο μπλοκ αποδεσμεύεται απο το hash_table αφόυ γίνουν οι απαραίτητες συνδέσεις των νέων μπλοκ στο hash_table. Επιπλέον, εάν μετά απο διάσπαση το ένα εκ των δύο μπλοκ παραμείνει γεμάτο μετά το rehashing, τότε θα χρειαστεί να ξαναγίνει διάσπαση, ελέγχοντας φυσικά το αν χρειάζεται και διπλασιασμός. Αυτό το πετυχαίνουμε αναδρομικά, με την διαφορά όμως οτι τώρα το μπλοκ προς διάσπαση θα είναι ενα εκ των δύο που δημιουργήθηκαν. Συγκεκριμένα, εκείνο που δεν θα έχει αρκετό χώρο για εγγραφή. ΠΡΟΒΛΗΜΑΤΑ: Λόγω αυξημένου φόρτου προγράμματος δεν προλάβαμε να εφαρμόσουμε σωστά όλες τις unpin των block. Το πρόγραμμα που έχει παραδωθεί εκτυπώνει όλες τις εγγραφές κανονικά, αλλά προκύπτει BF_FULL_MEMORY_ERROR για RECORDS_NUM > 500. Εάν στο αρχείο "extra.c", στη συνάρτηση bucket_split, κάνουμε uncomment τις τελευταίες γραμμές BF_UnpinBlock(new_block) και BF_UnpinBlock(new_block2), τότε το πρόγραμμα κάνει κανονικά εισαγωγή όλων των εγγραφών (RECORDS_NUM = 1000000) χωρίς κάποιο σφάλμα. Το μόνο πρόβλημα σε αυτη τη περίπτωση, εντοπίζεται στην εκτύπωση, καθώς δεν εμφανίζονται όλες οι εγγραφές. Για τον λόγο αυτο αποφασίσαμε να παραδώσουμε την συγκεκριμένη έκδοση. Σε κάθε περίπτωση, είμαστε πρόθυμοι να συζητήσουμε σχετικά με το συγκεκριμένο θέμα στην προφορική εξέταση.
About
Υλοποίηση Συστημάτων Βάσεων Δεδομένων, Εργασία 2
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published