Δυαδική Αναζήτηση ή btree θέμα την ενημέρωση του δείκτη

ψήφοι
4

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

Η δουλειά σου είναι να εντοπίσει τις αλλαγές και τις προσθήκες, και να περάσει μόνο αυτά, μαζί με τον εκδότη (που δεν έχει χρόνο για να διαβάσετε ολόκληρο το βιβλίο κάθε μέρα)

Για τους σκοπούς αυτού του προβλήματος, το βιβλίο αποτελείται από 1 εκατομμύριο γραμμές του κειμένου ASCII και αυξάνεται (στην πραγματικότητα ένα αρχείο αντιγράφου ασφαλείας MySQL).

τρέχουσα ιδέα μου είναι να κάνω μια ασφαλή hash (SHA256 για παράδειγμα) της κάθε γραμμής (1k Chars) και αποθηκεύστε το σε HD. Από το hash είναι μόνο 32bytes το αρχείο είναι μόνο 32MB.

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

Όταν ολοκληρωθεί η διαδικασία θα αντικαταστήσει το αρχείο κατακερματισμού έτοιμο για την επόμενη μέρα.

Η σύγκριση χρησιμοποιεί μια δυαδική μέθοδο αναζήτησης των χορδών συγκρίνετε (> <τελεστές) Αυτό επιστρέφει ένα αποτέλεσμα κατά μέσο όρο τέσσερις επαναλήψεις.

Δεν έχουν κωδικοποιηθεί μια λύση δείκτη btree ακόμα, αλλά πώς θα αντιμετωπίσουμε αυτό;

Δημοσιεύθηκε 30/10/2008 στις 01:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
1

Θα ήθελα να χρησιμοποιούν διαφ .

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

Απαντήθηκε 30/10/2008 στις 01:58
πηγή χρήστη

ψήφοι
0

«Στη συνέχεια, όταν θα έχουμε το επόμενο αρχείο αύριο, θα περάσει μέσα από αυτό γραμμή προς γραμμή, δημιουργώντας ένα νέο hash για κάθε γραμμή και συγκρίνοντάς το με το hash από την προηγούμενη ημέρα.»

Πήρε το: γραμμές 1m της σημερινής τιμές κατακερματισμού σε σύγκριση με το 1 εκατ γραμμές των αξιών του χθες.

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

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

Όλα αυτά είναι μια χαρά. Δεν είναι πολύ δύσκολο να εφαρμοστεί.

Στο πλαίσιο αυτό, τα ακόλουθα δεν έχει νόημα.

Η σύγκριση χρησιμοποιεί μια δυαδική μέθοδο αναζήτησης των χορδών συγκρίνετε (> <τελεστές) Αυτό επιστρέφει ένα αποτέλεσμα κατά μέσο όρο τέσσερις επαναλήψεις.

Υπάρχει κάποια παραγγελία για τις τιμές hash εκεί; Ή κάποια δομή δέντρου;

Απαντήθηκε 30/10/2008 στις 02:20
πηγή χρήστη

ψήφοι
0

Ένα βιβλίο από 1 εκατομμύριο γραμμές είναι τεράστια: υπάρχουν ίσως 30 με 50 γραμμές ανά σελίδα, οπότε ας είμαστε γενναιόδωροι και να υποθέσουμε 100 γραμμές ανά σελίδα, που σημαίνει 10.000 σελίδες στο βιβλίο.

Γραμμές 1 ΚΒ είναι επίσης πολύ μεγαλύτερη από ό, τι είναι φυσιολογικό? βασικές αναγνωσιμότητα δείχνει πουθενά κοντά σε τόσους πολλούς χαρακτήρες ανά γραμμή. Σκοπεύετε να hash γραμμές μέχρι 1 KB, ή κομμάτι το αρχείο σε 1 KB κομμάτια; Ένα πρόβλημα με το σύστημα σας είναι ότι οι επαναλαμβανόμενες γραμμές θα έχουν μια επαναλαμβανόμενη κατακερματισμού? ποτέ δεν θα μπορούσε να προσδιορίσει πότε ένα από αυτά τα γραμμών προστεθούν ή να διαγραφούν.

Θα, προφανώς, πρέπει να ενημερώσει τον εκδότη διαγράφονται γραμμές πάρα πολύ.

Όπως και με Glomek, θα ήθελα να χρησιμοποιήσει diffστο αρχείο. Αν κρατήσει το αρχείο στο πλαίσιο RCS ή CVS έλεγχο, θα έχετε μόνο την τρέχουσα έκδοση του αρχείου και τα diffs από τις προηγούμενες εκδόσεις αποθηκεύονται. Με αυτό, θα είναι σε θέση να παρέχει αθροιστική diffs πάνω από μια εβδομάδα ή μήνα πάρα πολύ.

Και πιθανότατα δεν θα αναπτύξει τη δική μου ευρετηρίασης B-Tree.

Απαντήθηκε 30/10/2008 στις 02:23
πηγή χρήστη

ψήφοι
0

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

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

Επίσης, δεν θα πρέπει να αναγνωρίσουν reorderings; ή μόνο προσθήκες / διαγραφές / αντικαταστάσεις;

η πιο γενική περίπτωση είναι η πλήρης rsync αλγόριθμο, που πάει κάπως έτσι:

  • παραμέτρους ορισμό:

    1. επιλέξτε ένα μέγεθος μπλοκ 512, ή 1κ λειτουργούν συνήθως εντάξει.
      • επιλέξτε μια «ισχυρή» αθροίσματος ελέγχου. κάτι σαν από MD4 ή έτσι. 64bits είναι πολλές.
      • επιλέξετε ένα «αδύναμο» τροχαίο αθροίσματος ελέγχου. που σας επιτρέπει να «αφαιρέσετε» η ουρά byte και «προσθέτουν», ένα byte κεφάλι για να πάρει το άθροισμα ελέγχου των μπλοκ 1-byte προς τα εμπρός. συνήθως ένα άθροισμα ελέγχου 16-bit λειτουργεί εντάξει.
  • υπογραφή παλιό αρχείο:

    1. διασχίζουν ολόκληρο το παλιό αρχείο, σε κάθε μπλοκ υπολογίζει τόσο ασθενής και ισχυρή αθροίσματα ελέγχου. με 16 και 64 bits αθροίσματα ελέγχου, και μπλοκ 512byte αυτό σημαίνει ότι 10bytes ανά μπλοκ, ή 20KB ανά megabyte. αυτή είναι η «υπογραφή»
  • τη δημιουργία «μπάλωμα» με νέο αρχείο, και την υπογραφή του παλιού αρχείου:

    1. φορτώσει την υπογραφή του παλιού αρχείου, το καλύτερο είναι ένας πίνακας κατακερματισμού, με τα αδύναμα αθροίσματα ελέγχου όπως κλειδιά, οι ισχυρές αθροίσματα ελέγχου και η θέση μπλοκ είναι οι τιμές.
      • διαβάστε το πρώτο μπλοκ του νέου αρχείου
      • τον υπολογισμό του αθροίσματος ελέγχου αδύναμη των φορτωμένων μπλοκ
      • ελέγξτε τον πίνακα κατακερματισμού για να δούμε αν η ασθενής άθροισμα ελέγχου δεν υπάρχει.
      • αν βρεθεί, υπολογίζει την ισχυρή άθροισμα ελέγχου και να συγκρίνετε με αυτό που διαπιστώθηκε κατά την hash
      • αν και οι δύο αθροίσματα ελέγχου ταιριάζουν, σήμα ως «πήρε» με την αναφορά μπλοκ του κατακερματισμού, εκ των προτέρων ένα ολόκληρο blocksize και επιστρέψτε στο βήμα 3
      • αν η ισχυρή άθροισμα ελέγχου δεν ταιριάζει, ή αν η ασθενής άθροισμα ελέγχου δεν ήταν στο hash, «roll», το αδύναμο άθροισμα ελέγχου, δηλαδή, «προσθέτουν» το επόμενο byte μετά το μπλοκ, και «αφαιρέσετε» το πρώτο byte από το ουρά.
      • προσθέστε το byte «αφαιρείται» από την ουρά στη λίστα των «νέων» bytes στο patch
      • επιστρέψτε στο βήμα 4
  • το έμπλαστρο στο παλιό αρχείο

    1. το «μπάλωμα» είναι η λίστα των «νέων» bytes που έπεσε, ενώ το τροχαίο το άθροισμα ελέγχου, καθώς και τον κατάλογο των μπλοκ που ταιριάζει στο παλιό αρχείο «πήρε».
Απαντήθηκε 30/10/2008 στις 02:34
πηγή χρήστη

ψήφοι
0

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

Χρειάζεται ένας αλγόριθμος κατακερματισμού με πολύ μεγάλη πλήκτρο με αυτήν την προσέγγιση είναι ευάλωτο σε επιθέσεις γενέθλια . MD5 ή της οικογένειας SHA θα ήταν καλό. Επίσης, δεν μπορεί να εντοπίσει τις διαγραφές χωρίς μετα-διαδικασία που περνά μέσα από τη διαφορά που αναζητούν λείπουν φυσικά τα κλειδιά. Αυτός ο υπολογισμός θα πρέπει πραγματικά να γνωρίζει την δομή του πίνακα.

Απαντήθηκε 30/10/2008 στις 09:44
πηγή χρήστη

ψήφοι
0

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

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

σύνδεσμο «diff» μου παίρνει σε μια σελίδα με μια περιγραφή του τι υποθέτω ότι είναι μια εφαρμογή; Δεν υπάρχει καμία σύνδεση λήψης, δεν υπάρχει καμία κώδικα σε οποιαδήποτε γλώσσα ... Τι είμαι εγώ που λείπει εδώ;

Μερικοί από εσάς έχετε μιλήσει για το επίπεδο byte διακριτότητα. Αυτό δεν είναι απαραίτητη. μόνο το επίπεδο της γραμμής διακριτότητας είναι απαραίτητη, διότι αν μη τι άλλο στη γραμμή έχει αλλάξει, ολόκληρη η γραμμή (εγγραφή) πρέπει να υποβληθούν σε επανεπεξεργασία becasue οποιαδήποτε αλλαγή στο εσωτερικό της γραμμής επηρεάζει το σύνολο της γραμμής.

Γι 'αυτό και σύγκριση γραμμές περίπου 1.000 χαρακτήρες (όχι δυαδικό), σε δύο αρχεία (σημερινό στιγμιότυπο και χθες στιγμιότυπο), που είναι το καθένα γραμμές 1m περίπου.

Έτσι, με τη χρήση ενός ασφαλούς hash όπως SHA256 (MD5 έχει συγκρούσεις και είναι αργή σε σύγκριση) που μπορεί να επεξεργαστεί περίπου 30MB / sec για HO φορητό υπολογιστή μου. Ο διακομιστής φυσικά θα μασάτε μέσα από αυτό πολύ πιο γρήγορα.

Έτσι, αν το αρχείο είναι arond 1GB, στη συνέχεια, κάνοντας όλες τις hases διαρκεί περίπου 33sec, και την ανάγνωση του αρχείου 1Gb χρησιμοποιώντας τα παράθυρα της μνήμης σελίδα διαρκεί περίπου 30 δευτερόλεπτα. δεν τρομακτική

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

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

Οι προτάσεις της ανάγνωσης εμπρόσθια σελίδα προς σελίδα είναι καλή, αλλά υποθέτει ότι τα δύο αρχεία είναι σε SMAE ώστε μέχρι μέχρι την πρώτη αλλαγή. Αυτό δεν μπορεί να γίνει δεκτό. Οι γραμμές (σειρές) θα μπορούσε να είναι σε οποιαδήποτε σειρά. Επίσης, επιλέγοντας ένα αυθαίρετο blocksize παραβιάζει την αναλυτικότητα της γραμμής. Για τους σκοπούς της παρούσας εργασίας, οι γραμμές είναι αμετάβλητος.

Από εκείνη την εξαιρετική σύνδεση στο invrementa φόρτωση: Αρχείο Σύγκριση Capture: Αυτή η μέθοδος είναι επίσης γνωστή ως η διαφορά στιγμιότυπο μέθοδο. Αυτή η μέθοδος λειτουργεί με την κράτηση πριν και μετά από τις εικόνες των αρχείων που απασχολούν στην αποθήκη δεδομένων. Οι Εγγραφές σε σύγκριση με βρει τις αλλαγές και τα κλειδιά ρεκόρ σε σύγκριση με βρείτε ένθετα και διαγραφές. Αυτή η τεχνική είναι πιο κατάλληλο στην περίπτωση των συστημάτων κληρονομιά, λόγω του γεγονότος που προκαλεί συνήθως δεν υπάρχουν και τα αρχεία καταγραφής συναλλαγών είναι είτε ανύπαρκτα είτε σε ιδιόκτητη μορφή. Δεδομένου ότι οι περισσότερες βάσεις δεδομένων κληρονομιά έχουν κάποιο μηχανισμό για τα δεδομένα ντάμπινγκ σε αρχεία, η τεχνική αυτή δημιουργεί περιοδικές στιγμιότυπα και στη συνέχεια συγκρίνει τα αποτελέσματα για την παραγωγή αρχείων αλλαγή. Βέβαια, όλα τα προβλήματα της στατικής σύλληψης είναι παρόντες εδώ. Προστέθηκε πολυπλοκότητα εισάγεται από την πρόκληση της σύγκρισης ολόκληρες γραμμές των πληροφοριών και από τους βασικούς αναγνώρισης και αντιστοίχισης. Αυτή η τεχνική είναι πολύπλοκη ως προς τη φύση και τυπικά δεν είναι επιθυμητό, ​​αλλά, σε ορισμένες περιπτώσεις, μπορεί να είναι η μόνη λύση.

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

Έτσι υποθέτω ότι είμαι στο σωστό δρόμο, τότε; Ένας δείκτης btree δεν θα δώσει ένα πλεονέκτημα;

Απαντήθηκε 31/10/2008 στις 08:47
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more