Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

Metatropi programmatos C se Daemon

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Metatropi programmatos C se Daemon

Δημοσίευση από lakritidis » 08 Σεπ 2008 20:01

Kalispera. Sorry gia ta greeklish, alla grafo se Linux kai den ksero pos mpainoun ta ellinika!!

Anyway. Exo ftiaksei ena programma se C pou diabazei kapoia data apo arxeio (ekatntades MB). To arxeio afto to exei dimiourgisei ena allo programma se C kai periexei dekades ekatommyria distinct words.

To programma loipon, diabazei to arxeio kai rixnei ta words se ena hash table (afou prwta sximatisei mia perfect hash function MPHF). Sti synexeia dexetai kai apantaei queries.

To problima einai oti afto thelo na doulepsei meso web interface (mias aplis html formas diladi).

An metatrepso se CGI to programma, tha prepei kathe fora na diabazei to arxeio, na dimiougei tin MPHF ktl, pragma pou pairnei arketa sec. Afto tha prepei na ginetai mono mia fora kai ta data prepei na menoun sti mnimi. Katalabaino oti prepei na metatrepso se Daemon to programma to opoio tha dexetai ta queries (signals?) apo ena apo CGI script.

To thema einai afto. Pos tha kano daemonize to programma? Kai pos to CGI interface tha epikoinwnisei me ton Daemon? Oi anazitiseis sto Google de boithisan. O kodikas pou brika kanei kati fork se processes ktl, alla meta tin ektelesi tou programmatows den yparxei kapoia active process.

Thanx.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Metatropi programmatos C se Daemon

Δημοσίευση από bxenos » 09 Σεπ 2008 04:48

μαθε τα δεδομενα του hash πινακα να σωζονται. Μολις τελειωσεις τις ταξινομησεις σου στην μνημη, σωσε το index σε αρχειο "προσωρινο" στον φακελο της εφαρμογης (ή και αλλου).
Προσωρινο εννοω:
αν δεν υπαρχει θα το φτιαξει αυτοματα (δεν χαλασε ο κοσμος),
αν το προγραμμα αποφασισει οτι χρειαζεται ανανεωση, θα το σβησει και θα το ξανακανει.
αν ομως το βρει και δεν χρειαζεται ανανεωση, θα επιταχυνθει πολυ η διαδικασια απο την πρωτη φορα που το τρεχεις.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Metatropi programmatos C se Daemon

Δημοσίευση από lakritidis » 09 Σεπ 2008 15:14

Μολις τελειωσεις τις ταξινομησεις σου στην μνημη
Ποιες ταξινομήσεις;
σωσε το index
Ποιο Index;

Σκοπός μου είναι να διαβαστεί το αρχείο εξ'αρχης, να φορτώσει το hash table στη μνήμη και στη συνέχεια να δέχεται input και να επιστρέφει output από τον πίνακα που έχει στη μνήμη.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Metatropi programmatos C se Daemon

Δημοσίευση από bxenos » 09 Σεπ 2008 23:19

ταξινομηση ειναι η δημιουργια του hash table.
το index ειναι το hash table.

ολες οι βασεις δεδομενων ετσι δουλευουν οταν κανεις "επιδιορθωση reindex", φτιαχνουν στην μνημη (αν χωρα) το hash table ή τα m-nodes και μετα σωζουν το index ολοκληρο σε αρχειο.
ενοειται οτι η δομη του hash table θα πρεπει να ειναι τετοια ωστε να επιτρεπει αποθηκευση σε δισκο και επαναφορτωση, αλλα αυτο ειναι το ευκολο τμημα.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Metatropi programmatos C se Daemon

Δημοσίευση από lakritidis » 11 Σεπ 2008 00:14

Δεν ξέρω αν έχεις κάτι άλλο στο μυαλό σου, αλλά τα τα hash tables δεν είναι τίποτε άλλο παρά απλά arrays. Κατά τη δημιουργία του hash table κανένα sorting δε λαμβάνει χώρα. Απλώς τα keys μπαίνουν σε probes τα οποία υποδεικνύει η hash function. Σε περίπτωση colission εφαρμόζεις κάποια από τις γνωστές colission resolution μεθοδολογίες (separate chaining, open addressing, double hashing κτλ).

Ούτε στη δημιουργία του hash table, ούτε στο insertion, ούτε στο deletion υπάρχει sorting.

Οι Indexes μιας βάσης δεδομένων δεν είναι hash tables, διότι τα hash tables δεν είναι κατάλληλη data structure για αποθήκευση στο δίσκο. Συνήθως χρησιμοποιούνται b-trees για structured data σε δίσκους. Αυτό για την επιδιόρθωση του index και το τι structures δημιουργούνται στη μνήμη δεν το ξέρω.

Τέλος πάντων μάλλον δεν έχεις καταλάβει τι θέλω να κάνω. Το πρόγραμμα δουλεύει σε terminal και τώρα θέλω να δουλέψει και στο web. Και επίσης δεν υπάρχει database.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

Metatropi programmatos C se Daemon

Δημοσίευση από bxenos » 11 Σεπ 2008 03:53

τι προτιμας, να διαβαζεις ολο το (μεγαλο οπως αναφερεις) αρχειο εισοδου και να κανεις τις επιλυσεις (διοτι μονο σε εργαστηριακα παραδειγματα βλεπω να υπαρχει perfect hash function) ή να διαβαζεις μονο τους πινακες (τους οποιους εχεις υλοποιησει σε σελιδες μνημης υποθετω);
αυτο που δεν καταλαβα στο τελευταιο σου post ειναι γιατι οι πινακες hash να μην μπορουν να αποθηκευτουν σε αρχειο, εδω κατασταση υπολογιστη με ram και process γινεται hιbbernate και δεν μπορει να αποθηκευτει ενα hash table;

οι βασεις δεδομενων συχνα χρησιμοποιουν hash αντι για b-trees διοτι δεν χρειαζεται να τροποποιουν συνεχως το δενδρο για να ειναι ισορροπημενο και δεν χρειαζονται κλειδωματα μεγαλων τμηματων του index (ασυμφορο σε πολλες ταυτοχρονες συνδεσεις)

τελος παντων, απ'οτι καταλαβα δεν σου κανει αυτη η λυση οποτε σταματαω.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Metatropi programmatos C se Daemon

Δημοσίευση από lakritidis » 11 Σεπ 2008 10:36

Καταρχήν να σε ευχαριστήσω για το χρόνο που διέθεσες για να απαντήσεις.

Perfect Hash Function generator έχουν όλοι οι compilers που διατηρούν τις reserved words σε in-memory lexicons.

Το gperf κάνει αυτή τη δουλειά http://www.gnu.org/software/gperf/

Εγώ υλοποιώ τον αλγόριθμο που περιγράφεται εδώ
Managing Gigabytes

Οι βάσεις δεδομένων δεν κάνουν διαρκώς rebalance τα b-trees τους, αλλά μεγαλώνουν το μέγεθος του πίνακα που υπάρχει στα φύλλα τους. Σίγουρα η Wikipedia δεν είναι η καταλληλότερη πηγή για data structures, αλλα αυτό είναι ενδεικτικό.

"B-trees have substantial advantages over alternative implementations when node access times far exceed access times within nodes. This usually occurs when most nodes are in secondary storage such as hard drives. By maximizing the number of child nodes within each internal node, the height of the tree decreases, balancing occurs less often, and efficiency increases."

Μάλλον ξεφύγαμε από το θέμα όμως.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Metatropi programmatos C se Daemon

Δημοσίευση από soteres2002 » 11 Σεπ 2008 18:56

lakritidis έγραψε: An metatrepso se CGI to programma, tha prepei kathe fora na diabazei to arxeio, na dimiougei tin MPHF ktl, pragma pou pairnei arketa sec. Afto tha prepei na ginetai mono mia fora kai ta data prepei na menoun sti mnimi. Katalabaino oti prepei na metatrepso se Daemon to programma to opoio tha dexetai ta queries (signals?) apo ena apo CGI script.

To thema einai afto. Pos tha kano daemonize to programma? Kai pos to CGI interface tha epikoinwnisei me ton Daemon? Oi anazitiseis sto Google de boithisan. O kodikas pou brika kanei kati fork se processes ktl, alla meta tin ektelesi tou programmatows den yparxei kapoia active process.

Thanx.
Eφόσον όπως λες το data structure του hash ταβλε για δοσμένη είσοδο του αρχείου (αυτό με τα πολλά ΜΒ) παραμένει ίδιο, μπορείς να το αποθηκεύσεις σε μια κατανεμημένη local cache . Το memcached ( http://www.danga.com/memcached/ ) είναι ένας γενικού τύπου κατανεμημένος caching daemon στον οποίον μπορείς να αποθηκεύσεις αφηρημένες δομές δεδομένων με ένα μέγιστο όγκο πληροφορίας που δηλώνεις σε ένα switch όταν ξεκινάς τον daemon. Δουλεύει με σειριακοποίηση για full-duplex επικοινωνία μεταξύ client and server. Για να ανακτήσεις τα δεδομένα, αρκεί να χρησιμοποιήσεις την client library της memcached (που υπάρχει για C/C++/PHP/Python και άλλες) ώστε μέσω TCP/IP να πάρεις πίσω τη δομή για χρήση στο πρόγραμμα. Άρα στην παρούσα φάση μπορείς να γράψεις ένα απλό CGI script, που υλοποιεί το συγκεκριμένο πρόβλημα με τη βοήθεια της cache. Οι χρόνοι θα είναι ικανοιποιητικοί για την ανάκτηση των δομών, της τάξης των ms, άν η cache είναι στον ίδιο host με τον CGI client. Χρησιμοποιώντας αυτό, δε χρειάζεται να κατασκευάσεις daemon, καθώς αυτό στην περπτωσή σου περιλαμβάνει και ζητήματα integrity που ίσως δεν σκέφτηκες ότι μπορούν να προκύψουν (πχ redundancy checks στα δεδομένα που μεταφέρονται για εντοπισμό και διόρθωση σφαλμάτων, πράγμα που κάνει η λύση που σου πρότεινα). Επίσης, σκέψου ότι για να κάνεις κάτι σαν αυτό που λες, παίζει πρόβλημα με τo byte ordering (big/little endian) και επομένως μέσω δικτύου δεν είναι δυνατόν να μεταφέρονται δομές δεδομένων πχ μέσω write() ή sendmsg() μεταξύ 2 end-points που το ένα είναι little και το άλλο big endian. Αν το project σου είναι γραμμένο σε μιά γλώσσα σαν την ΡΗΡ, μπορείς να φτιάξεις τον client σε αυτήν, για να είναι ομοιογενές το έργο σου. Επίσης, με αυτή την λύση μπορείς ανα τακτά χρονικά διαστήματα να ενημερώνεις την/τις caches, σε περίπτωση που θες να ενημερώσεις το hash table.

Επίσης, κάτι άλλο που μου έρχεται στο μυαλό (σε περίπτωση που δεν χρησιμοποιήσεις την cache) είναι να χρησιμοποιήσεις IPC σε Unix, ή message queues σε Windows. Για ένα Unix σύστημα, μπορεί να έχεις ένα πρόγραμμα που θα τρέχει στο background σαν "daemon", και το CGI θα χρησιμοποιεί πχ την κοινόχρηστη μνήμη για να κάνει το transfer. Βέβαια, δεν θα είναι αποδοτικό αν θέλεις να μεταφέρεις πολλά ΜΒ σε λογικό χρόνο.

Aν ακόμα σε απασχολεί πως θα φτιάξεiς σέρβερ κοίτα σελίδες 367++ από το Unix Netwrok Programming, Volume 1 3rd edition, Richard Stevens, Fenner, Rudoff. Δεν καλύπτεται σε μια απάντηση αυτό το ζήτημα (δύσκολο να φτιάξεις κάτι αποδοτικό, εύκολο σαν software).

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Metatropi programmatos C se Daemon

Δημοσίευση από lakritidis » 15 Οκτ 2008 11:33

Φίλε Soteres αν και αργά σε ευχαριστώ. Το βιβλίο που αναφέρεις το είχα υπόψιν μου, τελικά δεν μπόρεσα να μην το αγοράσω. Ενδιαφέροντα πράγματα έχει και με βοήθησε να λύσω το πρόβλημα με χρήση threads.

Ένας server μέσα σε ένα endless loop ακούει TCP requests και επεξεργάζεται κάθε request σε ξεχωριστό thread (μου μοιάζει με το shared memory environment που ανέφερες).

Νομίζω ότι είναι η βέλτιστη λύση στην περίπτωση μου, μιας και δεν υπάρχουν ουρές στην οποία θα πρέπει ο client να περιμένει το server να επεξεργαστεί ένα άλλο προηγούμενο request. Και επίσης δεν υπάρχει η ανάγκη να γίνονται copy μεγάλα blocks της μνήμης σε νέα processes.

Τόσο η επικοινωνία client/server όσο και η όλη διαδικασία είναι σφαίρα!

Thanx και πάλι.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Metatropi programmatos C se Daemon

Δημοσίευση από soteres2002 » 15 Οκτ 2008 14:36

Ωραία, χαίρομαι που οι συμβουλές μου έπιασαν τόπο... :pint: Και μιας που έφτιαξες daemon με κάποιο ίσως στοιχειώδες πρωτόκολο, η cache θα ήταν χρήσημη σαν storage πχ όταν κάνεις restart το daemon σου και αναγκαστικά πρέπει να χάσεις όλο το hash table από τη μνήμη, ώστε να το πάρεις με τη μία μόλις τον εκκινήσεις πάλι χωρίς να τον κάνεις build από την αρχή, άρα ίσως κερδίζοντας σημαντικό χρόνο.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες