panoupanou Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Καλημέρα. Θα ήθελα να σας ρωτήσω μερικα πραγματα σχετικα με την εγγραφή και ανάγνωση αρχείων στην C. 1. Η αναγνωση ενος binary αρχείου απο κώδικα c είναι αισθητα πιο γρηγορη απο ένα ascii αρχειο το οποίο περιέχει μόνο αριθμούς? 2. Η εγγραφή επισής ενος binary είναι πιο γρηγορη απο την εγγραφή ενος ascii που περιεχει ακριβως τα ίδια data? ευχαριστω.
defacer Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Δεν υπάρχει καμία διαφορά στην ταχύτητα αν έχεις αποθηκεύσει μέσα τα ίδια πράγματα. Αν "binary" εννοείς κάποια άλλη μορφή των δεδομένων που καταλαμβάνει λιγότερα bytes τότε προφανώς λιγότερα bytes = πιο γρήγορα. Αλλά αυτό δεν έχει να κάνει με το αν άνοιξες το αρχείο σαν binary ή text στη C. @παπί ?
migf1 Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Το πόσο γρήγορα ή πόσο αργά διαβάζεις/γράφεις ένα αρχείο δεν έχει να κάνει με τον τύπο των δεδομένων, αλλά με τον τρόπο με τον οποίον τα διαβάζεις/γράφεις. Για παράδειγμα, ανεξαρτήτως τύπου των δεδομένων (έτσι κι αλλιώς εσωτερικά ίδια είναι όλα) το να διαβάζεις/γράφεις μονοκόμματα όλο το αρχείο είναι πολύ ταχύτερο από το να το διαβάζεις/γράφεις τμηματικά. Επίσης, αν δεν σε ενδιαφέρει να είναι cross-platform ο κώδικάς σου, προτίμησε να χρησιμοποιείς τις file i/o ρουτίνες που σου παρέχει το εκάστοτε λειτουργικό σου σύστημα (όσο πιο low level τόσο ταχύτερα).
nilosgr Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 (επεξεργασμένο) Λοιπον, 1 χαρακτηρας ascii = 8 bit 1 δυαδικος ακεραιος = 32 bit (αναλογως και το μηχανημα) Ο αριθμος 123456 εχει 6 χαρακτηρες, αρα σε ascii θελει 8 * 6 = 48 bit. Eνω στο διαδυκο εχει 32 bit. Ο αριθμος 789 εχει 3 χαρακτηρες, αρα σε ascii θελει 8 * 3 = 24 bit. Eνω στο διαδυκο εχει 32 bit. Ο αριθμος 123456 εχει 6 + 1 χαρακτηρες, αρα σε ascii θελει 8 * (6 + 1) = 56 bit. Eνω στο διαδυκο εχει 32 bit. Ο αριθμος 789 εχει 3 + 1 χαρακτηρες, αρα σε ascii θελει 8 * (3 + 1) = 32 bit. Eνω στο διαδυκο εχει 32 bit. Συμπερασμα για ακεραιους μικροτερους του 1000 "συμφερει" το ascii. Βεβαια, ολα αυτα ειναι για χωριτικοτητα μνημης κι οχι ταχυτητα. Η ταχυτητα αναγνωσης/εγγραφης εχει κι αλλες παραετρους, οπως word alignment, τοπικοτητα, batching κλπ κλπ ΙΜΟ, αν θες να δεις τι ειναι πιο γρηγορο κανε ενα τεστ με εγγραφη/αναγνωση με 100.000+ ακεραιους και μετρα χρονους για δυαδικο και για ascii (EDIT: τρεις απαντησεις, τρεις διαφορετικες προσεγγισεις) Επεξ/σία 9 Οκτωβρίου 2012 από nilosgr
kagelos Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να είναι το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία.
παπι Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 @παπί ? Αυτο εχω στο μυαλο μου οταν ακουω text (parse) Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να ήταν το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία.
migf1 Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Λοιπον, 1 χαρακτηρας ascii = 8 bit 1 δυαδικος ακεραιος = 32 bit (αναλογως και το μηχανημα) Ο αριθμος 123456 εχει 6 χαρακτηρες, αρα σε ascii θελει 8 * 6 = 48 bit. Eνω στο διαδυκο εχει 32 bit. Ο αριθμος 789 εχει 3 χαρακτηρες, αρα σε ascii θελει 8 * 3 = 24 bit. Eνω στο διαδυκο εχει 32 bit. Συμπερασμα για ακεραιους μικροτερους του 1000 "συμφερει" το ascii. Βεβαια, ολα αυτα ειναι για χωριτικοτητα μνημης κι οχι ταχυτητα. Η ταχυτητα αναγνωσης/εγγραφης εχει κι αλλες παραετρους, οπως word alignment, τοπικοτητα, batching κλπ κλπ ΙΜΟ, αν θες να δεις τι ειναι πιο γρηγορο κανε ενα τεστ με εγγραφη/αναγνωση με 100.000+ ακεραιους και μετρα χρονους για δυαδικο και για ascii (EDIT: τρεις απαντησεις, τρεις διαφορετικες προσεγγισεις) Φίλε nilosgr ομολογώ με μπέρδεψες. Για παράδειγμα, ο ακέραιος του 1ος byte uint8_t που έχει ας πούμε την τιμή 200 (μικρότερη δλδ του 1000) γιατί συμφέρει να τον αντιμετωπίσεις ως 3 διαφορετικά ASCII bytes ('2', '0' και '0') ?
kagelos Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Έχετε μια τάση (μερικοί μερικοί ) να διυλίζετε τον κώνωπα για τόσο απλά θέματα ...
defacer Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Συμπερασμα για ακεραιους μικροτερους του 1000 "συμφερει" το ascii.Βεβαια, ολα αυτα ειναι για χωριτικοτητα μνημης κι οχι ταχυτητα. Η ταχυτητα αναγνωσης/εγγραφης εχει κι αλλες παραετρους, οπως word alignment, τοπικοτητα, batching κλπ κλπ Όχι και όχι. Πρώτον έχεις κάνει ένα ουσιαστικό λάθος στην αποτίμηση των formats: ενώ λες ότι ο int είναι 4 bytes (προφανώς θεωρούμε ότι έτσι είναι στην πλατφόρμα, άρα κατευθείαν memory mapping) λες μετά ότι το "123" είναι 3 bytes. Πώς είναι δυνατόν ο deserializer να ξέρει ότι δεν ακολουθεί άλλο ψηφίο μετά; Στη γενική περίπτωση δε μπορεί, άρα θα χρειαστεί κάτι για delimiter επομένως από 3 χαρακτήρες θα πάμε σε 4, που είναι 33% αύξηση! Επιπλέον έχεις επιλέξει, αναμενόμενα μεν αλλά αυθαίρετα, συγκεκριμένους τρόπους αναπαράστασης τιμών (τα 4 fixed bytes που λέγαμε παραπάνω) χωρίς αυτό να είναι απαραίτητο. Για παράδειγμα αν ζορίζεσαι με το χώρο τότε μπορείς να αποθηκεύσεις σε binary έναν αυθαίρετα μεγάλο αριθμό N με ένα πολύ απλό encoding ξοδεύοντας 1 bit μόνο ανα byte "κανονικής" αναπαράστασης (edit: παρασύρθηκα), οπότε το 1000 θα πήγαινε σε 2 bytes μόνο. Δέυτερον η ταχύτητα ανάγνωσης/εγγραφής είναι dominated από το αποθηκευτικό μέσο και το stream stack του εκάστοτε runtime και όχι από αυτές τις παραμέτρους που αναφέρεις (αν κατάλαβα καλά τι εννοείς).
migf1 Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Έχετε μια τάση (μερικοί μερικοί ) να διυλίζετε τον κώνωπα για τόσο απλά θέματα ... Όπως για παράδειγμα; Για να καταλάβω αν συγκαταλέγομαι στους "μερικούς-μερικούς", περίπτωση κατά την οποία θα ήθελα να μου διευκρινήσεις αν θεωρείται "κώνωπας" το ότι όλα τα αρχεία δεν είναι τίποτε άλλο από μια ακολουθία από bytes.
defacer Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να είναι το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία. Όχι απαραίτητα. Το parsing είναι αμελητέο μπροστά στην ανάγνωση των δεδομένων.
kagelos Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 @migf1: δεν αναφέρομαι (μόνο) στο συγκεκριμένο θέμα και ούτε σε εσένα προσωπικά. Άποψη μου είναι ότι πολλές φορές σε αυτό το φόρουμ γράφονται άπειρες σελίδες σε "απλά" θέματα, υπεραναλύωντας τα άσκοπα, ενώ αντίθετα σε πιο προχωρημένα θέματα (τα οποία τείνουν προς την εξαφάνιση) δεν συνεισφέρουν και πολλοί. Τώρα βγαίνω τελείως off topic και ζητώ συγγνώμη. 2
migf1 Δημοσ. 9 Οκτωβρίου 2012 Δημοσ. 9 Οκτωβρίου 2012 @kagelos: Καταλαβαίνω τι εννοείς, αλλά οκ αυτό είναι σύνηθες στα φόρουμ προγραμματισμού, και Ελληνικά και ξένα. Πιστεύω πως κυρίως οφείλεται στην διαφορετική πείρα που έχουν οι συμμετέχοντες, καθώς επίσης και στο γεγονός πως συχνότατα η λεπτομέρεια κάνει την διαφορά στον προγραμματισμό. Θα έλεγα μάλιστα ότι αρκετά έως πολύ συχνά πάνε χέρι-χέρι.
panoupanou Δημοσ. 9 Οκτωβρίου 2012 Μέλος Δημοσ. 9 Οκτωβρίου 2012 Ok. Απο οτι κατάλαβα δεν έχει σχεδον καμια διαφορά η ταχύτητα ανάγνωσης αλλα μόνο το μεγεθος του τελικού αρχείου. Αν και πιστευα οτι τα binary files (fwrite, fread) είναι πιο γρηγορα σε αναγνωση. αφου δε χρησιμοποιεις ένα σωρο fscanf() για να διαδιαβασεις ένα file με πολλούς αριθμούς αλλα μόνο ένα pointer οριζεις. Σωστα??
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα