kfoynt Δημοσ. 7 Αυγούστου 2010 Δημοσ. 7 Αυγούστου 2010 Καλησπέρα Χρειάζομαι να φτιάξω ένα διάνυσμα το οποίο ειναι σχεδόν 35.000.000 θέσεων για double. Μου έχουν δώσει ένα αρχείο το οποίο χρησιμοποιεί >VECT(P->qcoeff, double, max_nzq) όπου max_nzq οι διαστάσεις. Αλλά όταν πάει να εκτελέσει την γραμμή μου λέει: No memory for 34000000 elements of size 8 Προσπάθησα να χρησιμοποιήσω malloc >P->qcoeff = (double*)malloc(max_nzq*sizeof(double)); αλλά τώρα παίρνω segmentation fault, και στον debugger άμα προσπαθήσω να δώ αν παίρνει τιμές το διάνυσμα qcoeff λέει: Cannot access memory at address 0xf7f50aa8 Καμία ιδέα κάποιος? παίζει κάποιος περιορισμός από τον compiler? ---------- Προσθήκη στις 01:41 ---------- Προηγούμενο μήνυμα στις 01:02 ---------- έτρεξα >ulimit -s unlimited για να μεγαλώσω το stack, αλλά πάλι τα ίδια... παίζει που ειμαι κάτω απο virtual machine σε linux??
Directx Δημοσ. 7 Αυγούστου 2010 Δημοσ. 7 Αυγούστου 2010 Σε Windows XP ο παρακάτω κώδικας δεσμεύει 35.000.000 double (=8 byte) δηλαδή 280ΜΒ, δίχως πρόβλημα: > #include <stdio.h> #include <stdlib.h> int main() { double *ptrDblMem = NULL; if((ptrDblMem = (double*)calloc(35000000, sizeof(double))) == NULL) printf("calloc failed.\n"); else { printf("calloc ok."); free(ptrDblMem); } printf("\n\nPress Enter to exit .."); getchar(); return 0; } Linux δεν έχω πρόχειρο για να κάνω δοκιμές - κοίταξε αν μπορείς να αυξήσεις την διαθέσιμη μνήμη (ειδικά αφού δουλεύεις σε περιβάλλον VM) ή έλεγξε αν διαχειρίζεσαι σωστά προ του seg.fault. την δεσμευμένη μνήμη (κάνε step-by-step execution ή βάλε κάποιο watch condition από τον debugger σου μέχρι να χτυπήσει το πρόβλημα). Αν το πρόβλημα παραμένει δες το Valgrind (ειδικό software εντοπισμού σφαλμάτων μνήμης κτλ για Linux) για το οποίο έχω ακούσει καλά λόγια. Καλή τύχη!
jstark Δημοσ. 7 Αυγούστου 2010 Δημοσ. 7 Αυγούστου 2010 Σε virtual box με ubuntu 32bit και 2GB mem, δεν φαινεται να υπάρχει πρόβλημα. Μήπως δεν εχεις δώσει αρκετή μνημη στο virtual machine ?
kfoynt Δημοσ. 7 Αυγούστου 2010 Μέλος Δημοσ. 7 Αυγούστου 2010 Σε virtual box με ubuntu 32bit και 2GB mem, δεν φαινεται να υπάρχει πρόβλημα. Μήπως δεν εχεις δώσει αρκετή μνημη στο virtual machine ? Λοιπόν, έβαλα mxDestroyArray (ειναι library απο matlab) και έσβηνα ότι δεν χρειαζόταν, κατάφερα να το κάνω να προχωρήσει λιγο παρακάτω, αλλά μετά ξανα αντιγράφει κάποια διανύσματα (δεν φταίω εγώ για αυτό, η βιβλιοθήκη που μου έδωσαν αντιγράφει τις μεταβλητές) και τώρα ζητάει double θέσεις για 70.000.000!!!! Δυστυχώς δεν μπορώ να το αλλάξω αυτό γιατί θα πρέπει να αλλάξω όλη την δομή του αλγοριθμού. Οπότε, κάτι πρέπει να κάνω με την μνήμη... για το VM του έχω δώσει 1024 RAM, 20 GB σκληρό, για βοήθησε λιγο με αυτό.. τα ulimit -s,-d,-m τα έχω unlimited. ευχαριστώ by the way.
jstark Δημοσ. 9 Αυγούστου 2010 Δημοσ. 9 Αυγούστου 2010 Λοιπόν, έβαλα mxDestroyArray (ειναι library απο matlab) και έσβηνα ότι δεν χρειαζόταν, κατάφερα να το κάνω να προχωρήσει λιγο παρακάτω, αλλά μετά ξανα αντιγράφει κάποια διανύσματα (δεν φταίω εγώ για αυτό, η βιβλιοθήκη που μου έδωσαν αντιγράφει τις μεταβλητές) και τώρα ζητάει double θέσεις για 70.000.000!!!! Δυστυχώς δεν μπορώ να το αλλάξω αυτό γιατί θα πρέπει να αλλάξω όλη την δομή του αλγοριθμού. Οπότε, κάτι πρέπει να κάνω με την μνήμη... για το VM του έχω δώσει 1024 RAM, 20 GB σκληρό, για βοήθησε λιγο με αυτό.. τα ulimit -s,-d,-m τα έχω unlimited. ευχαριστώ by the way. Δε γνωρίζω τι απαιτήσεις μνήμης έχει ένας πίνακας του matlab και αν κρατάει και άλλα πράγματα εκτός από τα δεδομένα, αλλά υποθέτω πως δε δημιουργεί πρόβλημα αυτός. Δοκίμασε να δώσεις 2GB μνήμη στο virtual machine, γιατί 1GB ίσως είναι οριακό. Σχετικά με το ulimit, και γω unlimited τα χω.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.