Skip to content

Υλοποίηση Συστημάτων Βάσεων Δεδομένων, Εργασία 2

Notifications You must be signed in to change notification settings

erikk03/Implementation-of-Database-Systems-Project2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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