Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Στους λαβυρίνθους των δεδομένων...

Îåêßíçóå áðü ôï ìÝëïò akarabidero. Τελευταία δημοσίευση από το μέλος akarabidero στις 09-10-2006, 16:09. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-02-2006, 17:16 9164

    Computer [co] Στους λαβυρίνθους των δεδομένων...

    Γεια σας και από εμένα!

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

     

    Το background είναι πως είμαι φοιτητής πολυτεχειακής σχολής υπολογιστών, σε μικρό έτος.

    Ως ώρας ξέρω C++ και Java ως προς τα βασικά τους (την C ηθελημένα και σκόπιμα την παραβλέπουμε…).

     

    Ας υποθέσουμε ότι έχω μία πειραματική λίστα δεδομένων η οποία περιέχει αρκετά εκατομμύρια εγγραφές και κάθε εγγραφή «κοστίζει» σε μνήμη 10 - 20 bytes.

    Το αρχείο στο οποίο περιέχονται οι εγγραφές είναι είτε text είτε binary.

     

    Θέλω  να ταξινομήσω αυτή την πειραματική λίστα δεδομένων, εν προκειμένω να δημιουργήσω ένα άλλο αρχείο στο οποίο να περιέχονται οι εγγραφές μου και «δίπλα» από κάθε εγγραφή να βρίσκεται και ο αριθμός των φορών που εμφανίζεται η εγγραφή στο αρχικό αρχείο.

     

    Δηλαδή στο καινούριο αρχείο να μην περιέχονται διπλογραμμένες τριπλογραμμένες τετραπλογραμμένες και ουτωκαθεξής εγγραφές αλλά αν κάποια εγγραφή βρίσκεται “ν” φορές στο αρχικό μου αρχείο,

    τότε στο καινούριο αρχείο να βρίσκεται αυτή η εγγραφή και «δίπλα» της ο αριθμός “ν” των φορών που εμφανίστηκε στο πρώτο αρχείο.

     

    Προσπάθησα να το υλοποιήσω και το υλοποίησα στη C, με συνδεδεμένη λίστα αλλά…

     

    Το πρόγραμμα λόγω της μεγάλης καταχώρησης μνήμης του μεγάλου αριθμού εγγραφών με την malloc δεν τελειώνει ούτε στον αιώνα τον άπαντα…J  (εξού και ο λόγος που δεν θέλω να λέω ότι γνωρίζω C… J)

     

    Ρώτησα κάποιον πιο «αρμόδιο» από εμένα και μου είπε ότι το πρόβλημά μου θα λυθεί αν γράψω ένα script σε SQL…

     

    Εγώ έχω όλη την καλή θέληση να κάτσω να μάθω όλα τα κουτσομπολιά που έχουν γραφτεί για την δεσποινίδα SQL και για την οικογένεια της, αλλά δεν ξέρω αν αξίζει…

     

    Και με το «αν αξίζει» εννοώ μήπως από «την φύση της» (αριστοτελικός όρος),

    μία λίστα δεδομένων με αρκετά εκατομμύρια εγγραφές απαιτεί μία πολύ ισχυρή υπολογιστική ισχύ hardware για να υλοποιηθεί η ταξινόμησή της, οπότε άδικα θα εντρυφήσω στην SQL και την παρέα της????????

     

    Από βιβλία δεν υπάρχει πρόβλημα η βιβλιοθήκη της σχολής μπορεί να θεωρηθεί όλη δική μου J

    Και συγκεκριμένα βρήκα ως ενδιαφέροντες του τίτλους:

     

    Database Application Developer’s Guide _ Borland Software Corporation

    Και

    Database Programming with JDBC and Java, Second Edition _ George Reese _  O'Reilly.

    (αλήθεια αυτή η JDBC ποια είναι? J)

     

    Λοιπόν, είναι μήπως θέμα  ισχύος hardware, και όχι θέμα αλγορίθμου ή το αντίθετο??????

    Και είναι θέμα software σε ποια γλώσσα και με ποιο σκεπτικό πρέπει να υλοποιήσω την ταξινόμηση?????????

     

    Σας ευχαριστώ, εκ των προτέρων.

  •  02-02-2006, 18:15 9167 σε απάντηση της 9164

    Απ: Στους λαβυρίνθους των δεδομένων...

    Η SQL και τα προϊόντα που την υποστηρίζουν είναι μονόδρομος αν θέλεις να ασχοληθείς με μεγάλο όγκο δεδομένων, καθώς υποστηρίζουν ήδη όλες τις τεχνικές τις οποίες θα έπρεπε να χρησιμοποιήσεις για να καταφέρεις να διαβάσεις και να ταξινομήσεις μια μεγάλη λίστα με C, χωρίς να απαιτούν μεγάλη ισχύ. Αν ήθελες να κάνεις την ίδια δουλειά με C θα έπρεπε να φτιάξεις αλγόριθμους ταξινόμησης στο δίσκο (η μνήμη δεν αρκεί ποτέ) καθώς και τη δικιά σου cache για να διαβάζεις blocks δεδομένων από το σκληρό στη μνήμη κλπ, κλπ.

    Οι βάσεις δεδομένων οργανώνουν τα δεδομένα σε πίνακες, στους οποίους δημιουργούν indexes για να βρίσκουν γρήγορα τις εγγραφές χρησιμοποιώντας διάφορους αλγόριθμους.
    Δουλεύουν περίπου όπως οι καρτέλες της βιβλιοθήκης: Πρώτα ψάχνεις στα γρήγορα ένα τίτλο στο index, για να βρεις σε ποιό διάδρομο και προθήκη βρίσκεται. Μετά πηγαίνεις εκεί και βρίσκεις το βιβλίο.

    Σε κάθε πίνακα τώρα μπορείς να ορίσεις πολλά διαφορετικά indexes, ανάλογα με το πως θέλεις να ταξινομήσεις τις εγγραφές. Αν πχ. έχεις εγγραφές φοιτητών με ονοματεπώνυμο, έτος, αριθμό μητρώου κλπ, μπορείς να δημιουργήσεις index για τον αριθμό μητρώου, ή για το ονοματεπώνυμο, ή για το έτος. Η βάση δεδομένων θα χρησιμοποιήσει αυτα τα index για να βρει τις εγγραφές ενός συγκεκριμένου φοιτητή, ή για να βρει στατιστικά, π.χ. πόσοι φοιτητές υπάρχουν ανά έτος.

    Αν υποθέσουμε ότι έχεις φτιάξει ένα πίνακα για φοιτητές, τον Students και θέλεις να βρεις πόσοι φοιτητές υπάρχουν ανά έτος, απλά κάνεις την κλήση:

    SELECT StudentYear, COUNT(*)
    FROM STUDENTS
    GROUP BY StudentYear

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

    Μια οποιαδήποτε βάση από το επίπεδο της Acces ή του MySQL και πάνω μπορεί να υποστηρίξει πολλές εκατοντάδες χιλιάδες εγγραφές, ενώ βάσεις όπως ο SQL Server Express και άνω υποστηρίζουν πολλά εκατομμύρια εγγραφές. Οι μεγάλες βάσεις δεδομένων, όπως ο SQL Server και η Oracle υποστηρίζουν δεκάδες terabytes δεδομένων.
    Τέλος, όσο πιο προχωρημένη είναι μια βάση, τόσο καλύτερους αλγόριθμούς χρησιμοποιεί και τόσο πιο γρήγορα εκτελεί τις εντολές.

    Πέρα από τη βάση όμως, πρέπει να γράψεις και το πρόγραμμα που θα την χρησιμοποιεί. Το πρόγραμμα αυτό μπορείς να το γράψεις σε όποια γλώσσα θέλεις, αλλά θα πρέπει να επικοινωνήσει με τη βάση χρησιμοποιώντας κάποιες βιβλιοθήκες. Ανάλογα με τη γλώσσα και τη βάση που θέλεις να χρησιμοποιήσεις επιλέγεις και την κατάλληλη βιβλιοθήκη. Αν χρησιμοποιήσεις Java, η βιβλιοθήκη που θα χρησιμοποιήσεις είναι η JDBC. Αν χρησιμοποιήσεις C#, VB.Net θα χρησιμοποιήσεις το ADO.NET. Οι περισσότερες βάσεις, πάντως, περιλαμβάνουν προγράμματα για να εκτελέσεις εντολές σε SQL χωρίς να χρειαστεί να φτιάξεις το δικό σου από την αρχή.

    Τώρα για τα βιβλία ... Εξαρτάται τί βάση θα χρησιμοποιήσεις και τί γλώσσα προγραμματισμού. Το πως να στήσεις τη βάση και πως να γράψεις απλές εντολές SQL καλύπτεται στις περισσότερες περιπτώσεις από το ίδιο το help τους. Τα βιβλία που βρήκες είναι για συγκεκριμένες γλώσσες, το πρώτο για Delphi και το δεύτερο για Java. Αν πρόκειται να γράψεις το πρόγραμμα σε Java, το δεύτερο βιβλίο μάλλον θα βοηθήσει.

    Διάλεξε πρώτα μια εύκολη βάση δεδομένων και μετά βρες ένα βιβλίο για αυτή. Νομίζω ότι η Access θα ήταν η ευκολότερη στην εγκατάσταση και τη χρήση. Ο SQL Server Express είναι μια άλλη, πολύ δυνατότερη βάση και είναι και δωρεάν. Για MySQL ή Oracle, δεν θα το συνιστούσα, καθώς η εγκατάσταση και η χρήση τους έχει δυσκολίες και απλά θα σε μπλέξει αν δεν ξέρεις ήδη από βάσεις δεδομένων. Επιπλέον, η Access και ο SQL Server έχουν πολύ καλό documentation που καλύπτει σχεδόν τα πάντα.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  05-02-2006, 21:38 9267 σε απάντηση της 9167

    Απ: Στους λαβυρίνθους των δεδομένων...

    Άκου φίλε τι θα κάνεις;
    1) σίγουρα για να δουλέψουν όλα τελεία είναι μονόδρομος η sql
    2) ο μονός τρόπος είναι να ανανεώνεται η βάση δεδομένων κάθε φορά που κατεβαίνει(αν και πάλι δεν θα φορτωθεί όλη:P) και όχι να φορτώνεται αμέσως όλη
  •  03-05-2006, 16:07 12281 σε απάντηση της 9167

    Απ: Στους λαβυρίνθους των δεδομένων...

     pkanavos wrote:
    Η SQL και τα προϊόντα που την υποστηρίζουν είναι μονόδρομος αν θέλεις να ασχοληθείς με μεγάλο όγκο δεδομένων, καθώς υποστηρίζουν ήδη όλες τις τεχνικές τις οποίες θα έπρεπε να χρησιμοποιήσεις για να καταφέρεις να διαβάσεις και να ταξινομήσεις μια μεγάλη λίστα με C, χωρίς να απαιτούν μεγάλη ισχύ. Αν ήθελες να κάνεις την ίδια δουλειά με C θα έπρεπε να φτιάξεις αλγόριθμους ταξινόμησης στο δίσκο (η μνήμη δεν αρκεί ποτέ) καθώς και τη δικιά σου cache για να διαβάζεις blocks δεδομένων από το σκληρό στη μνήμη κλπ, κλπ.

    Οι βάσεις δεδομένων οργανώνουν τα δεδομένα σε πίνακες, στους οποίους δημιουργούν indexes για να βρίσκουν γρήγορα τις εγγραφές χρησιμοποιώντας διάφορους αλγόριθμους.
    Δουλεύουν περίπου όπως οι καρτέλες της βιβλιοθήκης: Πρώτα ψάχνεις στα γρήγορα ένα τίτλο στο index, για να βρεις σε ποιό διάδρομο και προθήκη βρίσκεται. Μετά πηγαίνεις εκεί και βρίσκεις το βιβλίο.

    Σε κάθε πίνακα τώρα μπορείς να ορίσεις πολλά διαφορετικά indexes, ανάλογα με το πως θέλεις να ταξινομήσεις τις εγγραφές. Αν πχ. έχεις εγγραφές φοιτητών με ονοματεπώνυμο, έτος, αριθμό μητρώου κλπ, μπορείς να δημιουργήσεις index για τον αριθμό μητρώου, ή για το ονοματεπώνυμο, ή για το έτος. Η βάση δεδομένων θα χρησιμοποιήσει αυτα τα index για να βρει τις εγγραφές ενός συγκεκριμένου φοιτητή, ή για να βρει στατιστικά, π.χ. πόσοι φοιτητές υπάρχουν ανά έτος.

    Αν υποθέσουμε ότι έχεις φτιάξει ένα πίνακα για φοιτητές, τον Students και θέλεις να βρεις πόσοι φοιτητές υπάρχουν ανά έτος, απλά κάνεις την κλήση:

    SELECT StudentYear, COUNT(*)
    FROM STUDENTS
    GROUP BY StudentYear

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

    Μια οποιαδήποτε βάση από το επίπεδο της Acces ή του MySQL και πάνω μπορεί να υποστηρίξει πολλές εκατοντάδες χιλιάδες εγγραφές, ενώ βάσεις όπως ο SQL Server Express και άνω υποστηρίζουν πολλά εκατομμύρια εγγραφές. Οι μεγάλες βάσεις δεδομένων, όπως ο SQL Server και η Oracle υποστηρίζουν δεκάδες terabytes δεδομένων.
    Τέλος, όσο πιο προχωρημένη είναι μια βάση, τόσο καλύτερους αλγόριθμούς χρησιμοποιεί και τόσο πιο γρήγορα εκτελεί τις εντολές.

    Πέρα από τη βάση όμως, πρέπει να γράψεις και το πρόγραμμα που θα την χρησιμοποιεί. Το πρόγραμμα αυτό μπορείς να το γράψεις σε όποια γλώσσα θέλεις, αλλά θα πρέπει να επικοινωνήσει με τη βάση χρησιμοποιώντας κάποιες βιβλιοθήκες. Ανάλογα με τη γλώσσα και τη βάση που θέλεις να χρησιμοποιήσεις επιλέγεις και την κατάλληλη βιβλιοθήκη. Αν χρησιμοποιήσεις Java, η βιβλιοθήκη που θα χρησιμοποιήσεις είναι η JDBC. Αν χρησιμοποιήσεις C#, VB.Net θα χρησιμοποιήσεις το ADO.NET. Οι περισσότερες βάσεις, πάντως, περιλαμβάνουν προγράμματα για να εκτελέσεις εντολές σε SQL χωρίς να χρειαστεί να φτιάξεις το δικό σου από την αρχή.

    Τώρα για τα βιβλία ... Εξαρτάται τί βάση θα χρησιμοποιήσεις και τί γλώσσα προγραμματισμού. Το πως να στήσεις τη βάση και πως να γράψεις απλές εντολές SQL καλύπτεται στις περισσότερες περιπτώσεις από το ίδιο το help τους. Τα βιβλία που βρήκες είναι για συγκεκριμένες γλώσσες, το πρώτο για Delphi και το δεύτερο για Java. Αν πρόκειται να γράψεις το πρόγραμμα σε Java, το δεύτερο βιβλίο μάλλον θα βοηθήσει.

    Διάλεξε πρώτα μια εύκολη βάση δεδομένων και μετά βρες ένα βιβλίο για αυτή. Νομίζω ότι η Access θα ήταν η ευκολότερη στην εγκατάσταση και τη χρήση. Ο SQL Server Express είναι μια άλλη, πολύ δυνατότερη βάση και είναι και δωρεάν. Για MySQL ή Oracle, δεν θα το συνιστούσα, καθώς η εγκατάσταση και η χρήση τους έχει δυσκολίες και απλά θα σε μπλέξει αν δεν ξέρεις ήδη από βάσεις δεδομένων. Επιπλέον, η Access και ο SQL Server έχουν πολύ καλό documentation που καλύπτει σχεδόν τα πάντα.

     

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

    η ειρωνία είναι ότι λίγες μέρες μετά αφού έγραψα αυτό το πόστ μας έβαλλαν μια εργασία που να κάνει merge-sort σε λίστα της τάξεως 10^7 στοιχείων και που να τρέχει γρήγορα (C++/java)  και τώρα έχουμε μια εργασία για linear hashing στον σκληρό (η sql σε τι γλώσσα έχει δημιουργηθεί?)

    τεσπα, διάβασα κάτι ψιλά για SQL κυρίως από το γνωστό βιβλίο beginning SQL...

    θα ήθελα να ρωτήσω αφού  γράψω τις εντολές στο quiery:

    SELECT StudentYear, COUNT(*)
    FROM STUDENTS
    GROUP BY StudentYear

    υπάρχουν σύντομες εντολές σαν και αυτές που να δημιουργούν καινούριο table ή άλλη database από τα αποτελέσματα που εμφανίστηκαν από αυτές τις παραπάνω 3 γραμμές εντολών?(μήπως ενσωματώνεται καμία εντολή "update"?)

    επίσης υπάρχουν άλλες σύντομες εντολές που αν υποθέσουμε ότι έχουμε δύο tables, να βρίσκουν ποιες από τις εγγραφές του ενός table δεν υπάρχουν στο άλλο?

      ή θα πρέπει να βρώ τα :

     

     pkanavos wrote:
    Οι περισσότερες βάσεις, πάντως, περιλαμβάνουν προγράμματα για να εκτελέσεις εντολές σε SQL χωρίς να χρειαστεί να φτιάξεις το δικό σου από την αρχή.

    υγ. χρησιμοποιώ το SQL server 2005 develloper

  •  03-05-2006, 21:37 12286 σε απάντηση της 12281

    Απ: Στους λαβυρίνθους των δεδομένων...

    Η αλήθεια είναι ότι αυτά που λέει ο Παναγιώτης για την SQL ισχύουν.
    Επειδή όμως ακούω για linear hashing, merge sort και διάφορα για διαχείριση τεράστίων αρχείων στο δίσκο, ίσως -λέω, ίσως- δεν σου κάνει η βάση (με οποιαδήποτε SQL εντολή) γιατί ... τη διαχείριση αρχείων, η βάση την κάνει μόνη της!Confused [*-)]

    Φαντάζομαι λοιπόν, ότι σας ζητά να φτιάξετε μόνοι σας τις ρουτίνες για όλα αυτάIndifferent [:|], προσέχοντας να μην μεταφέρετε μεγάλα ποσά στη μνήμη, αλλά να "παίζετε" με pointers σε αρχεία.

    Αν, παρ' όλα αυτά κάνω λάθος, οι εντολές SQL που ζητάς είναι οι εξής:

    (Αφού φτιάξεις τον πίνακα APOTELESMATA)
    INSERT INTO APOTELESMATA( StudentYear, StudentNumber )
    SELECT StudentYear,Count(*)
    FROM STUDENTS
    GROUP BY STUDENTS.StudentYear;

    και


    SELECT StudentNumber
    FROM STUDENTS1
    WHERE STUDENTS1.StudentNumber
    NOT IN ( SELECT StudentNumber FROM STUDENTS2 );

     

    May the source be with you Smile [:)] young Jedi!

     

  •  04-05-2006, 10:16 12297 σε απάντηση της 12281

    Απ: Στους λαβυρίνθους των δεδομένων...

    Να συμπληρώσω κι εγώ. Δεν έχει νόημα να συζητάει κανείς σε τί γλώσσα γράφτηκε η SQL, η Prolog ή η Lisp. Σε όλες αυτές τις γλώσσες γράφεις τί θέλεις να κάνει ο υπολογιστής, όχι πως. Το πρόγραμμα που λαμβάνει τις εντολές αναλαμβάνει να βρει τον καλύτερο τρόπο να σου επιστρέψει τα αποτελέσματα που ζήτησες. Δεν έχει σημασία η γλώσσα που χρησιμοποιήθηκε για να γραφτούν τα προγράμματα, αλλά οι αλγόριθμοι αναζήτησης και βελτιστοποίησης των εντολών που δίνεις.

    Στην περίπτωση της SQL η βάση δεδομένων θα πάρει το ταπεινό select, και θα κοιτάξει πόσο μεγάλοι είναι οι πίνακες που εμπλέκονται, τί κλειδιά και indexes έχουν, πως μπορεί να ξαναγράψει το query σου με άλλο τρόπο ώστε να το απλοποιήσει και θα καταλήξει σε μια λίστα ενεργειών του στυλ: "Χρειάζομαι ένα index seek σε αυτό τον πίνακα, ένα table scan στον άλλο, να κάνω και ένα merge sort τα αποτελέσματα". Εμπλέκονται διάφορα modules εδώ: ένας parser που μετατρέπει τις εντολές SQL σε μια ενδιάμεση μορφή εντολών, ένας optimizer που απλοποιεί την αρχική εντολή και επιλέγει τον κατάλληλο τρόπο εκτέλεσης και τέλος, η ίδια η μηχανή του server που αναλαμβάνει να διαβάσει τα δεδομένα και να εκτελέσει τις αναζητήσεις.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  09-10-2006, 16:09 18307 σε απάντηση της 12297

    Απ: Στους λαβυρίνθους των δεδομένων...

    ευχαριστώ για τις απαντήσεις σας.

    Aς υποθέσουμε ότι έχω ένα textbox, ένα richtextbox, μία βάση δεδομέμων (σε sql 2005) και
    θέλω να κάνω αναζήτηση στις εγγραφές της βάσης για κάποια λέξη που έχω εισαγάγει στο textbox.

       Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Dim con As New SqlConnection
            con.ConnectionString = "server=(local);database=text;Trusted_Connection=yes"
     
            Dim cmd As New SqlCommand
            cmd.CommandText = "SELECT lines FROM testText WHERE lines ='" + TextBox1.Text + "'"
            cmd.Connection = con
            Try
                con.Open()
     
                Dim reader As SqlDataReader = cmd.ExecuteReader
                Do
                    While reader.Read
                        RichTextBox2.Text = reader("lines")
                    End While
                Loop While reader.NextResult
                reader.Close()
            Finally
                con.Close()
            End Try
        End Sub
    End Class


    μου εμφανίζεται exception στο σημείο
    Dim reader As SqlDataReader = cmd.ExecuteReader
    με μύνημα
    "the data types text and varchar are incompatible in the equal operator."

    εδω
    και εδώ
    λένε κάτι για like και patindex αλλά και πάλι δεν έχω το επιθυμητό αποτέλεσμα.
    με like αντι για = δεν εμφανίζεται καμία εγγραφή στο richtextbox ενώ για patindex μου εμφανίζεται κάποια άλλη exception

    με το "if your description are always under 8000 characters, you need to change to a varchar type"
    τι εννοείται?

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

    μήπως πρέπει να φτιάξω dataadapter με την παραπάνω εντολή και μετά με fill σε dataset να εμφανίσω τα επιθυμητά αποτελέσματα?
    αλλά υπέθεσα ότι είναι καλύτερη η χρήση datareader.

    η εγγραφές στη βάση με τύπο text μεταφέρονται από το richtextbox με font, size κτλπ που είχαν στο richtextbox?

    ευχαριστώ εκ των προτέρων.




Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems