Δημοσιεύτηκε: 01 Μαρ 2012, 00:23
Thanks! Χαλαρά, δεν υπάρχει βιασύνη.
Εγώ εντόπισα ήδη ένα πρόβλημα με αρχείο μεγέθους 1.9Gb. Όταν είναι compiled με mingw-gcc τότε κρασάρει. Όταν είναι compiled με Pelles-C, τότε δεν κρασάρει, αλλά έφτασε στο 1.6Gb και μετά δεν μπορούσε να κάνει allocate άλλη μνήμη... προφανώς και στς 2 περιπτώσεις δεν είχα τόσο ελεύθερη διαθέσιμη μνήμη (δεν έπαιξα με τις ρυθμίσεις τις εικονικής μνήμης πάντως).
Στη δομή Settings, υπάρχει ένα boolean πεδίο: unlimfsize που το έχω ίσο με FALSE. Όταν αυτό το πεδίο είναι FALSE, τα αρχεία διαβάζονται με την ρουτίνα: _Bool buffer_read_file_longmax( Buffer *buffer, const char *fname ) η οποία έχει όριο μεγέθους τα LLONG_MAX bytes (αυτά συνήθως είναι 2Gb). Όταν το πεδίο unlimfsize τεθεί ίσο με TRUE, τότε το διάβασμα των αρχείων γίνεται με την ρουτίνα: _Bool buffer_read_file( Buffer *buf, const char *fname, size_t chunklen ) η οποία δεν θέτει κανένα όριο στο μέγεθος του αρχείου. Αν δείτε στον κώδικα, την καλώ με chunklen = 100*1024*1024 που σημαίνει πως διαβάζει το αρχείο σε τμήματα των 100mbytes, μέχρι να διαβαστεί όλο ή να τελειώσει η μνήμη.
Οπότε αν θέλετε να δοκιμάσετε με αρχεία μεγαλύτερα των 2Gb, θέστε το πεδίο unlimfsize ίσο με TRUE (στην αρχή της main() θα το βρείτε, στην αρχικοποίηση της δομής Settings).
Υπάρχει επίσης ένα ακόμα θέμα με τον παρόντα κώδικα. Παρόλο που οι συναρτήσεις είναι φτιαγμένες να πιάνουν πιθανά exceptions και να μην κρασάρουν, εντούτοις δεν χρησιμοποιώ πάντα (ακόμα) τις τιμές επιστροφής τους, οπότε υπάρχει περίπτωση να μπει σε infinite loop, αν αποτύχει κάποια συνάρτηση (αυτά θα τα φτιάξω).
Σε γενικές γραμμές, προσπαθήστε να κάνετε το πρόγραμμα να ζοριστεί ή να κρασάρει, πιέζοντας στα όρια τις έως τώρα υλοποιημένες του λειτουργίες.
Εγώ εντόπισα ήδη ένα πρόβλημα με αρχείο μεγέθους 1.9Gb. Όταν είναι compiled με mingw-gcc τότε κρασάρει. Όταν είναι compiled με Pelles-C, τότε δεν κρασάρει, αλλά έφτασε στο 1.6Gb και μετά δεν μπορούσε να κάνει allocate άλλη μνήμη... προφανώς και στς 2 περιπτώσεις δεν είχα τόσο ελεύθερη διαθέσιμη μνήμη (δεν έπαιξα με τις ρυθμίσεις τις εικονικής μνήμης πάντως).
Στη δομή Settings, υπάρχει ένα boolean πεδίο: unlimfsize που το έχω ίσο με FALSE. Όταν αυτό το πεδίο είναι FALSE, τα αρχεία διαβάζονται με την ρουτίνα: _Bool buffer_read_file_longmax( Buffer *buffer, const char *fname ) η οποία έχει όριο μεγέθους τα LLONG_MAX bytes (αυτά συνήθως είναι 2Gb). Όταν το πεδίο unlimfsize τεθεί ίσο με TRUE, τότε το διάβασμα των αρχείων γίνεται με την ρουτίνα: _Bool buffer_read_file( Buffer *buf, const char *fname, size_t chunklen ) η οποία δεν θέτει κανένα όριο στο μέγεθος του αρχείου. Αν δείτε στον κώδικα, την καλώ με chunklen = 100*1024*1024 που σημαίνει πως διαβάζει το αρχείο σε τμήματα των 100mbytes, μέχρι να διαβαστεί όλο ή να τελειώσει η μνήμη.
Οπότε αν θέλετε να δοκιμάσετε με αρχεία μεγαλύτερα των 2Gb, θέστε το πεδίο unlimfsize ίσο με TRUE (στην αρχή της main() θα το βρείτε, στην αρχικοποίηση της δομής Settings).
Υπάρχει επίσης ένα ακόμα θέμα με τον παρόντα κώδικα. Παρόλο που οι συναρτήσεις είναι φτιαγμένες να πιάνουν πιθανά exceptions και να μην κρασάρουν, εντούτοις δεν χρησιμοποιώ πάντα (ακόμα) τις τιμές επιστροφής τους, οπότε υπάρχει περίπτωση να μπει σε infinite loop, αν αποτύχει κάποια συνάρτηση (αυτά θα τα φτιάξω).
Σε γενικές γραμμές, προσπαθήστε να κάνετε το πρόγραμμα να ζοριστεί ή να κρασάρει, πιέζοντας στα όρια τις έως τώρα υλοποιημένες του λειτουργίες.