Προς το περιεχόμενο

Εγγραφη και αναγνωση binary αρχειων απο C


panoupanou

Προτεινόμενες αναρτήσεις

Καλημέρα. Θα ήθελα να σας ρωτήσω μερικα πραγματα σχετικα με την εγγραφή και ανάγνωση αρχείων στην C.

 

1. Η αναγνωση ενος binary αρχείου απο κώδικα c είναι αισθητα πιο γρηγορη απο ένα ascii αρχειο το οποίο περιέχει μόνο αριθμούς?

 

2. Η εγγραφή επισής ενος binary είναι πιο γρηγορη απο την εγγραφή ενος ascii που περιεχει ακριβως τα ίδια data?

 

ευχαριστω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 60
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Δεν υπάρχει καμία διαφορά στην ταχύτητα αν έχεις αποθηκεύσει μέσα τα ίδια πράγματα.

 

Αν "binary" εννοείς κάποια άλλη μορφή των δεδομένων που καταλαμβάνει λιγότερα bytes τότε προφανώς λιγότερα bytes = πιο γρήγορα. Αλλά αυτό δεν έχει να κάνει με το αν άνοιξες το αρχείο σαν binary ή text στη C.

 

@παπί ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το πόσο γρήγορα ή πόσο αργά διαβάζεις/γράφεις ένα αρχείο δεν έχει να κάνει με τον τύπο των δεδομένων, αλλά με τον τρόπο με τον οποίον τα διαβάζεις/γράφεις.

 

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

 

Επίσης, αν δεν σε ενδιαφέρει να είναι cross-platform ο κώδικάς σου, προτίμησε να χρησιμοποιείς τις file i/o ρουτίνες που σου παρέχει το εκάστοτε λειτουργικό σου σύστημα (όσο πιο low level τόσο ταχύτερα).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Λοιπον,

  • 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: τρεις απαντησεις, τρεις διαφορετικες προσεγγισεις)

Επεξ/σία από nilosgr
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να είναι το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

@παπί ?

Αυτο εχω στο μυαλο μου οταν ακουω text (parse)

Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να ήταν το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπον,

  • 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') ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συμπερασμα για ακεραιους μικροτερους του 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 και όχι από αυτές τις παραμέτρους που αναφέρεις (αν κατάλαβα καλά τι εννοείς).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχετε μια τάση (μερικοί μερικοί :-) ) να διυλίζετε τον κώνωπα για τόσο απλά θέματα ...

 

Όπως για παράδειγμα;

 

 

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

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν το αρχείο περιέχει text το οποίο πρέπει να κάνεις parse για να το μετατρέψεις σε αριθμούς, είναι δραματικά πιο αργό από το να είναι το αρχείο binary. Στη δεύτερη περίπτωση απλά μεταφέρεις δεδομένα από τον δίσκο στη RAM χωρίς καμία περαιτέρω διαδικασία.

 

Όχι απαραίτητα. Το parsing είναι αμελητέο μπροστά στην ανάγνωση των δεδομένων.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@migf1: δεν αναφέρομαι (μόνο) στο συγκεκριμένο θέμα και ούτε σε εσένα προσωπικά.

 

Άποψη μου είναι ότι πολλές φορές σε αυτό το φόρουμ γράφονται άπειρες σελίδες σε "απλά" θέματα, υπεραναλύωντας τα άσκοπα, ενώ αντίθετα σε πιο προχωρημένα θέματα (τα οποία τείνουν προς την εξαφάνιση) δεν συνεισφέρουν και πολλοί.

 

Τώρα βγαίνω τελείως off topic και ζητώ συγγνώμη.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@kagelos:

 

 

 

Καταλαβαίνω τι εννοείς, αλλά οκ αυτό είναι σύνηθες στα φόρουμ προγραμματισμού, και Ελληνικά και ξένα.

 

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

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Αν και πιστευα οτι τα binary files (fwrite, fread) είναι πιο γρηγορα σε αναγνωση. αφου δε χρησιμοποιεις ένα σωρο fscanf() για να διαδιαβασεις ένα file με πολλούς αριθμούς αλλα μόνο ένα pointer οριζεις.

 

Σωστα??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...